자바 Http 인터페이스 추가,검사 방법
최근 에 일부 전자상거래 업 무 를 접 했 는데 전자상거래 업무 인 터 페 이 스 를 처리 할 때 예 를 들 어 타 오 바 오,결제 류 인 터 페 이 스 를 발견 했다.인터페이스 쌍방 은 데이터 매개 변수 가 전송 과정 에서 변경 되 지 않도록 인터페이스 데 이 터 를 추가 서명 한 다음 에 인터페이스 서버 에서 인터페이스 매개 변 수 를 검사 하여 두 서명 이 똑 같 도록 확보 해 야 한다.검 사 를 통과 한 후에 업무 논리 처 리 를 진행 하 다.우 리 는 여기 서 주로 처리 방향 을 소개 합 니 다.서명 알고리즘 에 대해 저 는 소 개 를 많이 하지 않 고 인터넷 에 많이 있 습 니 다.
2.처리 방향
쌍방 은 매개 변 수 를 특정한 순서에 따라 배열 하기 로 약속 했다.예 를 들 어 이니셜 의 순서에 따라 배열 하 는 것 이다.예 를 들 어 url:http://xxx/xxx.do?a=wersd&b=sd2354&c=4&signature=XXXXXXXXXXXX(signature 는 전 송 된 서명 입 니 다)입 참 을 받 은 후에 매개 변 수 를 a=wersd&b=sd 2354&c=4 로 연결 합 니 다.약속 한 서명 규칙 에 따라 md5 로 서명 한 다음 에 입 참 된 signature 값 과 비교 합 니 다.호출 자가 합 법 적 인지 확인 하 는 것 이 인터페이스 서명 검증 의 사고방식 이다.
3.실례 연습
인터페이스 쌍방 은 의사 소통 을 통 해 인터페이스 에 대해 다음 과 같은 공감 대 를 형성 했다.
1.주의사항 은 인터페이스의 프로 토 콜,전송 매개 변수 유형,서명 알고리즘,파일 형식 등 설명 을 말한다.
2.다음은 전자상거래 업무 인터페이스의 실제 사례 로 쌍방 은 인터페이스 URL,업무 매개 변수,고정 매개 변수,서명 과 데이터 형식 을 되 돌려 주기 로 약속 했다.
인터페이스 호출 시 인터페이스 호출 자 코드 는 다음 과 같 습 니 다(참고 만 제공).
package com.pcmall;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class APITest {
static String TEST_URL = " ";
static String TEST_KEY = " ";
static String TEST_SEC = " ";
public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {
String result = getResult(TEST_URL, getReqParam());
System.out.print(result);
}
private static String getReqParam() throws UnsupportedEncodingException, NoSuchAlgorithmException {
TreeMap<String, String> req = new TreeMap<String, String>();
req.put("a", TEST_KEY);
req.put("f", "json");
req.put("l", "zh_CN");
req.put("m", "zhongan.repair.query");
req.put("v", "1.0");
req.put("i", "" + System.currentTimeMillis() / 1000);
req.put("params", "{\"assignNo\":\"TEST018\"}");
req.put("s", sign(req, null, TEST_SEC));
StringBuilder param = new StringBuilder();
for (Iterator<Map.Entry<String, String>> it = req.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, String> e = it.next();
param.append("&").append(e.getKey()).append("=").append(URLEncoder.encode(e.getValue(), "UTF-8"));
}
return param.toString().substring(1);
}
private static String sign(Map<String, String> paramValues, List<String> ignoreParamNames, String secret) throws NoSuchAlgorithmException, UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
List<String> paramNames = new ArrayList<String>(paramValues.size());
paramNames.addAll(paramValues.keySet());
if (ignoreParamNames != null && ignoreParamNames.size() > 0) {
for (String ignoreParamName : ignoreParamNames) {
paramNames.remove(ignoreParamName);
}
}
Collections.sort(paramNames);
sb.append(secret);
for (String paramName : paramNames) {
sb.append(paramName).append(paramValues.get(paramName));
}
sb.append(secret);
MessageDigest md = MessageDigest.getInstance("SHA-1");
return byte2hex(md.digest(sb.toString().getBytes("UTF-8")));
}
private static String byte2hex(byte[] bytes) {
StringBuilder sign = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
return sign.toString();
}
private static String getResult(String urlStr, String content) {
URL url = null;
HttpURLConnection connection = null;
try {
url = new URL(urlStr);
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
connection.setUseCaches(false);
connection.connect();
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.write(content.getBytes("UTF-8"));
out.flush();
out.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
reader.close();
return buffer.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
return null;
}
}
서버 쪽 코드 는 다음 과 같 습 니 다(참고 만 제공).
@RequestMapping("/repairTakeOrder")
@ResponseBody
public ResponseVO repairTakeOrder(@RequestBody String jsonStr) {
logger.info("repairTakeOrder :" + jsonStr);
ResponseVO responseVO = null;
try {
RepairOrder repairOrder = JackJsonUtil.toBean(jsonStr,
RepairOrder.class);
TreeMap<String, String> paramsMap = new TreeMap<String, String>();
paramsMap.put("gsxx01", repairOrder.getGsxx01());
paramsMap.put("orderType", repairOrder.getOrderType().toString());
paramsMap.put("serviceNo", repairOrder.getServiceNo());
paramsMap.put("vipCard", repairOrder.getVipCard());
paramsMap.put("customerName", repairOrder.getCustomerName());
paramsMap.put("customerPhone", repairOrder.getCustomerPhone());
paramsMap.put("customerTel", repairOrder.getCustomerTel());
paramsMap.put("province", repairOrder.getProvince());
paramsMap.put("city", repairOrder.getCity());
paramsMap.put("county", repairOrder.getCounty());
paramsMap.put("address", repairOrder.getAddress());
paramsMap.put("salerCode", repairOrder.getSalerCode());
paramsMap.put("salerName", repairOrder.getSalerName());
paramsMap.put("storeCode", repairOrder.getStoreCode());
paramsMap.put("storeName", repairOrder.getStoreName());
paramsMap.put("site", repairOrder.getSite());
paramsMap.put("siteDesp", repairOrder.getSiteDesp());
paramsMap.put("engineerCode", repairOrder.getEngineerCode());
paramsMap.put("engineerName", repairOrder.getEngineerName());
if (repairOrder.getServiceDate() != null) {
paramsMap.put("serviceDate",
DateUtils.formatDate(repairOrder.getServiceDate()));
}
if (repairOrder.getSalePrice() != null) {
paramsMap.put("salePrice", repairOrder.getSalePrice()
.toString());
}
paramsMap.put("profitCenter", repairOrder.getProfitCenter());
paramsMap.put("costCenter", repairOrder.getCostCenter());
paramsMap.put("gsxx02", repairOrder.getGsxx02());
paramsMap.put("returnReason", repairOrder.getReturnReason());
if (repairOrder.getOriOrder() != null) {
paramsMap.put("oriOrder", repairOrder.getOriOrder().toString());
}
if (repairOrder.getOriServiceNo() != null) {
paramsMap.put("oriServiceNo", repairOrder.getOriServiceNo());
}
// (a=1&b=2)
String paramSrc = RequestUtils.getParamSrc(paramsMap);
logger.info(" :" + paramSrc);
//
if (SignUtils.verifymd5(paramSrc, repairOrder.getSign())) {
//
responseVO=erpServiceImpl.repairTakeOrder(repairOrder);
} else {
responseVO = new ResponseVO();
responseVO.setSuccess(false);
responseVO.setErrorMsg(" ");
}
} catch (Exception e) {
logger.error("", e);
responseVO = new ResponseVO();
responseVO.setSuccess(false);
responseVO.setErrorMsg(StringUtils.isNotBlank(e.getMessage()) ? e.getMessage() : " ");
}
return responseVO;
}
이상 의 자바 Http 인터페이스 에 서명 을 추가 하고 서명 을 검사 하 는 방법 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 지지 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.