1 package com.netease.nim.route; 2 3 import com.alibaba.fastjson.JSONObject; 4 import com.netease.nim.route.CheckSumBuilder; 5 import org.apache.commons.io.IOUtils; 6 import org.slf4j.Logger; 7 import org.slf4j.LoggerFactory; 8 import org.springframework.stereotype.Controller; 9 import org.springframework.web.bind.annotation.RequestMapping; 10 import org.springframework.web.bind.annotation.RequestMethod; 11 import org.springframework.web.bind.annotation.ResponseBody; 12 import javax.servlet.http.HttpServletRequest; 13 import java.io.IOException; 14 15 @Controller 16 @RequestMapping(value = {"/route"}) 17 public class RouteController { 18 public static final Logger logger = LoggerFactory 19 .getLogger(RouteController.class); 20 21 // 需要改成自身应用的appSecret 22 private final String appSecret = "7bb79g40f44j"; 23 24 @RequestMapping(value = {"/mockClient.action"}, method = {RequestMethod.POST}) 25 @ResponseBody 26 public JSONObject mockClient(HttpServletRequest request) 27 throws Exception { 28 JSONObject result = new JSONObject(); 29 try { 30 // 获取请求体 31 byte[] body = readBody(request); 32 if (body == null) { 33 logger.warn("request wrong, empty body!"); 34 result.put("code", 414); 35 return result; 36 } 37 38 // 获取部分request header,并打印 39 String ContentType = request.getContentType(); 40 String AppKey = request.getHeader("AppKey"); 41 String CurTime = request.getHeader("CurTime"); 42 String MD5 = request.getHeader("MD5"); 43 String CheckSum = request.getHeader("CheckSum"); 44 logger.info("request headers: ContentType = {}, AppKey = {}, CurTime = {}, " + 45 "MD5 = {}, CheckSum = {}", ContentType, AppKey, CurTime, MD5, CheckSum); 46 47 // 将请求体转成String格式,并打印 48 String requestBody = new String(body, "utf-8"); 49 logger.info("request body = {}", requestBody); 50 51 // 获取计算过的md5及checkSum 52 String verifyMD5 = CheckSumBuilder.getMD5(requestBody); 53 String verifyChecksum = CheckSumBuilder.getCheckSum(appSecret, verifyMD5, CurTime); 54 logger.debug("verifyMD5 = {}, verifyChecksum = {}", verifyMD5, verifyChecksum); 55 56 // TODO: 比较md5、checkSum是否一致,以及后续业务处理 57 58 result.put("code", 200); 59 return result; 60 } catch (Exception ex) { 61 logger.error(ex.getMessage(), ex); 62 result.put("code", 414); 63 return result; 64 } 65 } 66 67 private byte[] readBody(HttpServletRequest request) throws IOException { 68 if (request.getContentLength() > 0) { 69 byte[] body = new byte[request.getContentLength()]; 70 IOUtils.readFully(request.getInputStream(), body); 71 return body; 72 } else 73 return null; 74 } 75 76 }
1 package com.netease.nim.route; 2 3 import java.security.MessageDigest; 4 5 6 public class CheckSumBuilder { 7 // 计算并获取CheckSum 8 public static String getCheckSum(String appSecret, String nonce, String curTime) { 9 return encode("sha1", appSecret + nonce + curTime); 10 } 11 12 // 计算并获取md5值 13 public static String getMD5(String requestBody) { 14 return encode("md5", requestBody); 15 } 16 17 private static String encode(String algorithm, String value) { 18 if (value == null) { 19 return null; 20 } 21 try { 22 MessageDigest messageDigest 23 = MessageDigest.getInstance(algorithm); 24 messageDigest.update(value.getBytes()); 25 return getFormattedText(messageDigest.digest()); 26 } catch (Exception e) { 27 throw new RuntimeException(e); 28 } 29 } 30 private static String getFormattedText(byte[] bytes) { 31 int len = bytes.length; 32 StringBuilder buf = new StringBuilder(len * 2); 33 for (int j = 0; j < len; j++) { 34 buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); 35 buf.append(HEX_DIGITS[bytes[j] & 0x0f]); 36 } 37 return buf.toString(); 38 } 39 private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', 40 '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 41 }