使用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、项目源码-免费下载哦;

http://download.csdn.net/detail/u011431550/8321637

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值