spring mvc自定义过滤器filter实现对请求参数编解码的代码

百度,google了半天即使再万能的stackoverflow上也没有得到解答,今天偶然间发现springmvc注解@RequestParam不是通过HttpServletRequest.java的getParameter(String name)方法得到的参数值,而是通过getParameterValues得到的,怪不得debug了半天getParameter方法就是未被调用,filter也没生效。

相关代码如下:

RequestFilter.java

01 package com.zuidaima.filter;
02  
03 import java.io.IOException;
04 import java.io.UnsupportedEncodingException;
05  
06 import javax.servlet.FilterChain;
07 import javax.servlet.ServletException;
08 import javax.servlet.http.HttpServletRequest;
09 import javax.servlet.http.HttpServletRequestWrapper;
10 import javax.servlet.http.HttpServletResponse;
11  
12 import org.springframework.web.filter.OncePerRequestFilter;
13 /**
14 *@author www.zuidaima.com
15 **/
16 public class RequestFilter extends OncePerRequestFilter {
17  
18     public String filter(HttpServletRequest request, String input) {
19         String ret = input;
20                 //ios客户端请求参数值可能为(null)服务端过滤掉当null处理即可
21         if (input == null || input.trim().equals("(null)")) {
22                         ret=null;
23             return ret;
24         }
25         final String userAgent = request.getHeader("User-Agent");
26         final String method = request.getMethod();
27                 //该处可以实现各种业务的自定义的过滤机制
28         if (method.equalsIgnoreCase("get")
29                 || userAgent.toLowerCase().indexOf("android") != -1) {
30             try {
31                 ret = new String(input.getBytes("ISO8859-1"), "utf-8");
32             catch (UnsupportedEncodingException e) {
33                 e.printStackTrace();
34             }
35         }
36         return ret;
37     }
38  
39     @Override
40     protected void doFilterInternal(final HttpServletRequest request,
41             HttpServletResponse response, FilterChain chain)
42             throws ServletException, IOException {
43  
44         chain.doFilter(new HttpServletRequestWrapper(request) {
45             @Override
46             public String getParameter(String name) {
47                 String value = super.getParameter(name);
48                 return filter(this, value);
49             }
50  
51             @Override
52             public String[] getParameterValues(String name) {
53                 String[] values = super.getParameterValues(name);
54                 if (values == null) {
55                     return null;
56                 }
57                 for (int i = 0; i < values.length; i++) {
58                     values[i] = filter(this, values[i]);
59                 }
60                 return values;
61             }
62  
63         }, response);
64  
65     }
66 }

当然必须在web.xml中配置启动该过滤器:

1 <filter>
2         <filter-name>RequestFilter</filter-name>
3         <filter-class>com.zuidaima.filter.RequestFilter</filter-class>
4     </filter>
5     <filter-mapping>
6         <filter-name>RequestFilter</filter-name>
7         <url-pattern>*.htm</url-pattern>
8     </filter-mapping>

这样就可以实现全局的控制springmvc的参数过滤,比如xss,编解码等业务,比在每个springmvc方法中对每个参数值进行判断和过滤简单方便多了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值