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

 

 

原文地址:https://blog.csdn.net/xiaoyu19910321/article/details/52838828

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

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值