java请求参数防修改_Java Filter过滤器中添加或修改request参数值

业务场景

在传递数据的过程中, 需要用到加解密, 但是在每个接口中都来调用加解密的话, 整个程序就会变得非常臃肿, 所以当下考虑的解决方法是在统一返回的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 parameterMap; // 所有参数的Map集合

/**

* ChangeRequestWrapper构造函数

* @param request

*/

public ChangeRequestWrapper(HttpServletRequest request) {

super(request);

// 给参数集合赋值

parameterMap = request.getParameterMap();

}

/**

* 获取所有参数名

*

* @return 返回所有参数名

*/

@Override

public Enumeration getParameterNames() {

Vector vector = new Vector(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 getParameterMap() {

return parameterMap;

}

public void setParameterMap(Map 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 parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());

// 修改集合中的某个参数

parameterMap.put("word", new String[]{"新秩序"});

// 将集合存到自定义HttpServletRequestWrapper

changeRequestWrapper.setParameterMap(parameterMap);

// 替换原本的request

filterChain.doFilter(changeRequestWrapper, servletResponse);

}

@Override

public void destroy() {

}

}

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

Max Snow

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值