1. 程式人生 > >使用filter配合裝飾器模式實現對請求引數加密

使用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、專案原始碼-免費下載哦;