使用filter拦截参数去掉两端的空格(资料+亲测解决)

来源:互联网 发布:c图形化编程 编辑:程序博客网 时间:2024/05/06 05:21
使用filter拦截参数去掉两端的空格(解决)
问题:
1、当前环境:springMVC + spring 
2、所有从前台输入的参数数据,都要去除两端的空格

思考:
1.使用拦截器拦截request,然后通过get参数列表trim去除空格。创建后发现根本没法将trim后的参数设置回request中去。(试过之后放弃)
2.在每个 bean 中使用 get方法 参数trim ,非bean参数 每个单独 trim  (想想就觉得麻烦,放弃)
 public String getUsername() {        return username==null?null:username.trim(); }


3.通过 过滤器+重写HttpServletRequestWrapper类,将修改后的参数列表写回request中  (过滤器和拦截器都可以完成,实际上我第一种想法是可行的,httpServletRequestWrapper类可以将参数写回request中)
解决:(通过网上大神博客,自己验证,确实可用,一下为我的demo)
1.创建过滤器,拦截方法,提过调用我们自己的代有trim方法的类。
package top.demo.interceptor;
import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.filter.OncePerRequestFilter;public class ParamsFilter extends OncePerRequestFilter {        @Override      protected void doFilterInternal(HttpServletRequest request,              HttpServletResponse response, FilterChain filterChain)              throws ServletException, IOException {  //只是我们自己写的param参数去除空格并写回的类            ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper(request);              filterChain.doFilter(requestWrapper, response);      }  } 




2.编写获取参数并去空格然后写回request的实现类。

package top.demo.interceptor;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class ParameterRequestWrapper extends HttpServletRequestWrapper {        private Map<String , String[]> params = new HashMap<String, String[]>();    @SuppressWarnings("unchecked")    public ParameterRequestWrapper(HttpServletRequest request) {        // 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似        super(request);        //将参数表,赋予给当前的Map以便于持有request中的参数        this.params.putAll(request.getParameterMap());        this.modifyParameterValues();    }    //重载一个构造方法    public ParameterRequestWrapper(HttpServletRequest request , Map<String , Object> extendParams) {        this(request);        addAllParameters(extendParams);<span style="white-space:pre"></span>//这里将扩展参数写入参数表    }        public void modifyParameterValues(){<span style="white-space:pre"></span>//将parameter的值去除空格后重写回去        Set<String> set =params.keySet();        Iterator<String> it=set.iterator();        while(it.hasNext()){           String key= (String) it.next();           String[] values = params.get(key);           values[0] = values[0].trim();           params.put(key, values);         }    }        @Override    public String getParameter(String name) {//重写getParameter,代表参数从当前类中的map获取        String[]values = params.get(name);        if(values == null || values.length == 0) {            return null;        }        return values[0];    }      public String[] getParameterValues(String name) {//同上         return params.get(name);    }   public void addAllParameters(Map<String , Object>otherParams) {//增加多个参数        for(Map.Entry<String , Object>entry : otherParams.entrySet()) {            addParameter(entry.getKey() , entry.getValue());        }    }    public void addParameter(String name , Object value) {//增加参数        if(value != null) {            if(value instanceof String[]) {                params.put(name , (String[])value);            }else if(value instanceof String) {                params.put(name , new String[] {(String)value});            }else {                params.put(name , new String[] {String.valueOf(value)});            }        }    }  }  




3.在web.xml中配置,是这个filter生效。放在org.springframework.web.filter.CharacterEncodingFilter类之后,否则返回的参数乱码 


<!-- 过滤参数的两端空格  --><filter>      <filter-name>ParamsFilter</filter-name>      <filter-class>top.lushunde.interceptor.ParamsFilter</filter-class>  </filter>  <filter-mapping>      <filter-name>ParamsFilter</filter-name>      <url-pattern>/*</url-pattern>  </filter-mapping> 



功能代码完成。
4.测试代码
(1)、jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">    <title>用户登录</title></head><body>     <form action="${pageContext.request.contextPath}/user/login" method="post" id="mainForm" >    用户名:<input type="text" name="username"  value=""/> </br>    密码 :<input type="text" name="password"  value=""/></br>    验证码:<input type="text" name="yzm" value=""/></br>    <input type="submit" value="提交"/></br>    显示:|${param }|     </form> </body></html>


(2)controller代码
package top.lushunde.controller;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import top.lushunde.model.User;@Controller@RequestMapping("/user")public class UserController {    //处理登录表单    @RequestMapping(value = "/login",method = RequestMethod.POST)    public String login(HttpServletRequest request, User user,String yzm){    System.out.println(user.toString()+"yzm:"+yzm);           request.setAttribute("param", user.toString()+"yzm:"+yzm);            return "/user/login";            }}




(3)model
package top.lushunde.model;public class User {    private String username;    private String password;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    @Override    public String toString() {        return "username:"+username+"password:"+password;    }}


0 0
原创粉丝点击