使用filter攔截引數去掉兩端的空格(資料+親測解決)
阿新 • • 發佈:2018-12-10
使用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;
}
}