业务场景
在传递数据的过程中, 需要用到加解密, 但是在每个接口中都来调用加解密的话, 整个程序就会变得非常臃肿, 所以当下考虑的解决方法是在统一返回的JsonResult的类中做统一加密, 在Filter中去做统一解密.
遇到的问题
Filter的doFilter方法中的request只有setAttribute而没有setParameter也没有add方法, 所以是没办法直接添加或修改参数的。只能重写HttpServletRequestWrapper, 然后用自己重写的HttpServletRequestWrapper来修改参数, 再替换doFilter的request.
原本request参数类型是ServletRequest接口, HttpServletRequestWrapper是ServletRequest的一个实现类.
代码实现
自定义HttpServletRequestWrapper
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;
public class ChangeRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> parameterMap; // 所有参数的Map集合
/**
* ChangeRequestWrapper构造函数
* @param request
*/
public ChangeRequestWrapper(HttpServletRequest request) {
super(request);
// 给参数集合赋值
parameterMap = request.getParameterMap();
}
/**
* 获取所有参数名
*
* @return 返回所有参数名
*/
@Override
public Enumeration<String> getParameterNames() {
Vector<String> vector = new Vector<String>(parameterMap.keySet());
return vector.elements();
}
/**
* 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
*
* @param name 指定参数名
* @return 指定参数名的值
*/
@Override
public String getParameter(String name) {
String result = super.getParameter(name);
return result;
}
/**
* 获取指定参数名的所有值的数组,如:checkbox的所有数据
* 接收数组变量 ,如checkobx类型
*/
@Override
public String[] getParameterValues(String name) {
return parameterMap.get(name);
}
@Override
public Map<String, String[]> getParameterMap() {
return parameterMap;
}
public void setParameterMap(Map<String, String[]> parameterMap) {
this.parameterMap = parameterMap;
}
}
Filter
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
//@WebFilter(filterName = "LangFilter", urlPatterns = "/*")
public class LangFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 初始化自定义HttpServletRequestWrapper
ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
// 获取所有参数集合
Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
// 修改集合中的某个参数
parameterMap.put("word", new String[]{"新秩序"});
// 将集合存到自定义HttpServletRequestWrapper
changeRequestWrapper.setParameterMap(parameterMap);
// 替换原本的request
filterChain.doFilter(changeRequestWrapper, servletResponse);
}
@Override
public void destroy() {
}
}
参考链接
https://blog.csdn.net/weixin_34061482/article/details/93545118