外部介面 -- 密文校驗與資料傳輸
阿新 • • 發佈:2019-01-11
1. 對於第三方引用我們的介面,按照一切不信任原則,我們都要進行加密校驗。
2.考慮到密文驗證的通用性,將此方法從controller剝離出來,放到攔截器實現。
step1 : 註冊攔截器
<mvc:interceptors> <!-- 外部介面攔截器 --> <mvc:interceptor> <mvc:mapping path="/junjin/api/outSideInterface.do" /><!-- 如果不配置或/*,將攔截所有的Controller --> <bean class="com.junjin.interceptor.OutSideInterfaceInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
step2 : 繼承HandlerInterceptor
<span style="font-size:12px;"><span style="font-family:SimSun;font-size:10px;">//在實際的handler被執行前被呼叫 </span>public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 讀取配置檔案中的金鑰 ConstPropertiesReader propertiesReader = ConstPropertiesReader.getInstance(); String key = propertiesReader.get("key").toString(); // 獲得客戶端密文(token是第三方放在url後面的請求資料) String token = request.getParameter("token"); // request獲取post請求的資料 : String postContent = RequestUtil.getJSONStringAsciiCode(request); // 對傳送的資料進行加密 String tokenCheck = TokenUtil.generateToken(key, postContent); logger.info(tokenCheck); if (tokenCheck.equals(token)) { //將資料返回到controller層面 <span style="color:#FF0000;">request.setAttribute("postContent", postContent);</span> return true; } else { FjsCallBackObject obj = new FjsCallBackObject(); obj.setStatus(1); obj.setMsg("密文不匹配,請重新提交"); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Type", "text/plain;charset=UTF-8"); response.getWriter().write(FastJsonUtil.toJSONString(obj)); return false; } }</span>
step2_1 : 從request中讀取post請求的資料
<span style="font-size:12px;"><span style="color:#FF0000;">import org.apache.commons.io.IOUtils;</span> public static String CHARSET = "UTF-8"; public static Stirng getJsonStringAsciiCode(HttpServletRequest request){ String json = ""; try{ ServletInputStream in = request.getInputStream(); String content = <span style="color:#FF0000;">IOUtils</span>.toString(in,CHARSET); json = URLDecoder.decode(content,CHARSET); }catch(IOException e){ e.printStackTrace(); } return json; } </span>