使用filter拦截参数去掉两端的空格(解决)
问题:
1、当前环境:springMVC + spring
2、所有从前台输入的参数数据,都要去除两端的空格
思考:
1.使用拦截器拦截request,然后通过get参数列表trim去除空格。创建后发现根本没法将trim后的参数设置回request中去。(试过之后放弃)
2.在每个 bean 中使用 get方法 参数trim ,非bean参数 每个单独 trim (想想就觉得麻烦,放弃)
3.通过 过滤器+重写HttpServletRequestWrapper类,将修改后的参数列表写回request中 (过滤器和拦截器都可以完成,实际上我第一种想法是可行的,httpServletRequestWrapper类可以将参数写回request中)
解决:(通过网上大神博客,自己验证,确实可用,一下为我的demo)
1.创建过滤器,拦截方法,提过调用我们自己的代有trim方法的类。
2.编写获取参数并去空格然后写回request的实现类。
3.在web.xml中配置,是这个filter生效。放在org.springframework.web.filter.CharacterEncodingFilter类之后,否则返回的参数乱码
功能代码完成。
4.测试代码
(1)、jsp页面:
(2)controller代码
(3)model
问题:
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;
}
}