使用filter配合裝飾器模式實現對請求引數加密
1、目標
完成對request請求引數的加密
2、設計的知識點
a、filter、servlet、裝飾器模式
3、遇到問題
在寫這個程式的時候遇到一點一點小問題;什麼問題呢?
a、就是一個關於HttpServletRequestWrapper和servletRequestWrapper的問題;
b、HttpServletRequestWrapper實現的是HttpServletRequest介面而後者則是實現的是ServletRequest介面;
c、當第一次請求的時候,系統預設的請求是型別是requestFacade的一個型別,這個requestFacade型別實現了HttpServletRquest的介面;
d、我第一次用的時候,我寫的EncryptionReqestWrapper類是繼承了ServletRequstWrapper的類的;雖然程式沒報錯,一執行卻報錯了,報的是not-request和respone;在網上查了下;大概的意思就是傳入的request的型別不對;
e、所以我做了一個實驗我以為是ServletRequest介面的實現類不能作為引數傳入dofilter中的request作為引數;但是我實驗結果是可以的程式不報錯;但是精度會損失,就向父類接收子類,精度會丟失,後來沒辦法只能傳入一個HttpServletReqest的型別給doFIlter中的request;程式沒報錯;正確執行;
f、補充下因為使用filter攔截所以doFilter中的request是實現了HttpServletRequest介面的requestFacade;只要保持傳入的引數最終型別一致就可以了;
a、核心程式碼
package com.wen.wrapper; import java.security.NoSuchAlgorithmException; import java.util.Map; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import com.wen.md5.SecurityUtil; import com.wen.propertis.PropertiesUtils; public class EncryptionReqestWrapper extends HttpServletRequestWrapper { private static String secretKey; /** * 類載入時候執行初始化金鑰 */ static { Properties prop = PropertiesUtils.getInstance().load("secretKey"); secretKey = prop.getProperty("key"); } public EncryptionReqestWrapper(HttpServletRequest request) { super(request); } @Override public String getParameter(String name) { try { return SecurityUtil.md5(secretKey, super.getParameter(name)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } @Override public Map<String, String[]> getParameterMap() { // 遍歷原始的請求引數 for (Map.Entry<String, String[]> m : super.getParameterMap().entrySet()) { for (int i = 0; i < m.getValue().length; i++) { // 加密值 try { m.getValue()[i] = SecurityUtil.md5(secretKey, m.getValue()[i]); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } } return super.getParameterMap(); } @Override public String[] getParameterValues(String name) { String[] parameterValues = super.getParameterValues(name); for (int i = 0; i < parameterValues.length; i++) { try { parameterValues[i] = SecurityUtil.md5(secretKey, parameterValues[i]); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } return parameterValues; } }
package com.wen.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import com.wen.wrapper.EncryptionReqestWrapper;
public class EncryptionFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
request = new EncryptionReqestWrapper((HttpServletRequest) request);
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
4、關於servletRequest和HttpServletReqest的繼承關係;
5、關於md5程式中的md5在加密中文的時候和網上不一致,如果需要解密請同樣使用程式中的md5加密後匹配則可以進行驗證;需要Tools工具包的朋友加我Q619066780;
6、專案原始碼-免費下載哦;