使用HttpServletRequestWrapper重写Request请求参数

使用HttpServletRequestWrapper重写Request请求参数

目的: 改变请求参数的值,满足项目需求(如:过滤请求中 lang != zh 的请求)

方法: 1.使用 HttpServletRequestWrapper重写

复制代码

 1 public class ChangeRequestWrapper extends HttpServletRequestWrapper {
 2     private Map<String, String[]> parameterMap; // 所有参数的Map集合
 3 
 4     public ChangeRequestWrapper(HttpServletRequest request) {
 5         super(request);
 6         parameterMap = request.getParameterMap();
 7     }
 8 
 9     // 重写几个HttpServletRequestWrapper中的方法
10 
11     /**
12      * 获取所有参数名
13      *
14      * @return 返回所有参数名
15      */
16     @Override
17     public Enumeration<String> getParameterNames() {
18         Vector<String> vector = new Vector<String>(parameterMap.keySet());
19         return vector.elements();
20     }
21 
22     /**
23      * 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
24      *
25      * @param name 指定参数名
26      * @return 指定参数名的值
27      */
28     @Override
29     public String getParameter(String name) {
30         String[] results = parameterMap.get(name);
31         return results[0];
32     }
33 
34 
35     /**
36      * 获取指定参数名的所有值的数组,如:checkbox的所有数据
37      * 接收数组变量 ,如checkobx类型
38      */
39     @Override
40     public String[] getParameterValues(String name) {
41         return parameterMap.get(name);
42     }
43 
44     @Override
45     public Map<String, String[]> getParameterMap() {
46         return parameterMap;
47     }
48 
49     public void setParameterMap(Map<String, String[]> parameterMap) {
50         this.parameterMap = parameterMap;
51     }
52 }

复制代码

 

      2.新增Filter

复制代码

 1 public class LangFilter implements Filter {
 2     @Override
 3     public void init(FilterConfig filterConfig) throws ServletException {
 4 
 5     }
 6 
 7     @Override
 8     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 9 
10         ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
11 
12         Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
13 
14         String[] strings = parameterMap.get("lang");
           //逻辑代码给定默认的参数值,如果参数不为中文,则直接返回异常
15         if (strings == null || strings.length == 0) {
16             strings = new String[1];
17             strings[0] = "zh";
18             parameterMap.put("lang", strings);
19             changeRequestWrapper.setParameterMap(parameterMap);
20         }else{
21             String language = strings[0];
22             if (!language.equals("zh")) {
23                 Map<String,String> error = new HashMap<>();
24                 error.put("code","500");
25 
26                 ServletOutputStream outputStream = null;
27                 try {
28                     outputStream = servletResponse.getOutputStream();
29                     outputStream.write(JSONUtils.obj2Byte(error));
30                 } finally {
31                     if (outputStream != null) {
32                         outputStream.flush();
33                         outputStream.close();
34                     }
35                 }
36 
37                 return;
38             }
39         }
40         //使用复写后的wrapper
41         filterChain.doFilter(changeRequestWrapper, servletResponse);
42     }
43 
44     @Override
45     public void destroy() {
46 
47     }
48 }

复制代码

     3.web.xml增加一个过滤器处理

复制代码

 1   <filter>
 2         <filter-name>languageFilter</filter-name>
 3         <filter-class>com.intercepor.LangFilter</filter-class>
 4         <init-param>
 5             <param-name>encoding</param-name>
 6             <param-value>UTF-8</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>forceEncoding</param-name>
10             <param-value>true</param-value>
11         </init-param>
12     </filter>
13 
14     <filter-mapping>
15         <filter-name>languageFilter</filter-name>
16         <url-pattern>*.do</url-pattern>
17     </filter-mapping>

复制代码

所有.do的请求,都会验证此参数

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HttpServletRequestWrapper是一个装饰器模式的实现,它允许我们在不改变原始请求的情况下,对请求进行修改。在Interceptor中,我们可以通过HttpServletRequestWrapper来修改request参数。 首先,我们需要自定义一个类继承HttpServletRequestWrapper重写getParameter方法,以实现修改request参数的功能。具体实现如下: ``` public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { private Map<String, String[]> params = new HashMap<>(); public MyHttpServletRequestWrapper(HttpServletRequest request) { super(request); this.params.putAll(request.getParameterMap()); } @Override public String getParameter(String name) { String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values[0]; } @Override public Map<String, String[]> getParameterMap() { return params; } @Override public Enumeration<String> getParameterNames() { return Collections.enumeration(params.keySet()); } public void addParameter(String name, String value) { if (params.containsKey(name)) { String[] values = params.get(name); values = Arrays.copyOf(values, values.length + 1); values[values.length - 1] = value; params.put(name, values); } else { params.put(name, new String[]{value}); } } } ``` 接下来,在Interceptor中,我们可以通过如下代码来使用MyHttpServletRequestWrapperrequest参数进行修改: ``` public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getMethod().equalsIgnoreCase("get")) { // 使用MyHttpServletRequestWrapper请求参数进行修改 MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(request); requestWrapper.addParameter("key", "value"); // 将修改后的request传给下一个Interceptor或Controller request = requestWrapper; } return true; } ``` 上述代码中,我们先判断请求的方法是否为get,如果是,则使用MyHttpServletRequestWrapper请求参数进行修改,然后将修改后的request传给下一个Interceptor或Controller。如果请求方法不为get,则直接将原始request传给下一个Interceptor或Controller。 需要注意的是,使用HttpServletRequestWrapperrequest参数进行修改时,只有在下一个Interceptor或Controller真正使用request参数时,修改后的参数才会生效。如果在当前Interceptor中进行了修改,但在下一个Interceptor或Controller中并没有使用修改后的参数,那么修改就会失效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值