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

使用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;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值