1. 程式人生 > >使用filter攔截引數去掉兩端的空格(資料+親測解決)

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

}

}