用户在使用系统时有意无意可能会输入空格,一般来说在字符串首尾的空格都是无意义的(密码值除外),所以在使用SSM框架时可以加入参数空格过滤器。
· 该图中的字符串保存在数据库前并未经过参数空格过滤器过滤,导致在数据库里的字符串前面存在空格。
1.在项目包com.text.filter中,编写参数空格编码过滤器ParameterTrimFilter:
package com.text.filter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 请求参数值空格过滤器(去除前后空格)
*/
public class ParameterTrimFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest)request;
HashMap map = new HashMap(req.getParameterMap());
if (map != null && map.size() > 0) {
//hashmap的遍历
// 获取键值对的迭代器
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
String key = (String) entry.getKey();
//直接用(String) entry.getValue()会爆出这个错误[Ljava.lang.String; cannot be cast to java.lang.String
//不能把String[]转化为String类型。
String[] value = (String[])entry.getValue();
//去掉字符串两端的多余的空格
for(int i = 0;i < value.length;i++){
value[i] = value[i].trim();
}
map.put(key, value);
}
}
//使用HttpServletRequestWrapper重写Request请求参数
ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper(req,map);
//chain.doFilter(request,response)将请求转发给过滤器链上下一个filter,如果没有filter那就是请求的资源。
//一般filter都是一个链,web.xml 里面配置了几个就有几个。
//一个一个的连在一起 :request -> filter1 -> filter2 ->filter3 -> .... -> request resource
chain.doFilter(changeRequestWrapper, response);
}
public void destroy() {
// TODO Auto-generated method stub
}
}
2.其中,ParameterRequestWrapper类(使用HttpServletRequestWrapper重写Request请求参数):
package com.text.filter;
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class ChangeRequestWrapper extends HttpServletRequestWrapper {
private Map params; // 所有参数的Map集合
public ChangeRequestWrapper(HttpServletRequest request, Map newParams) {
super(request);
params = newParams;
}
// 重写几个HttpServletRequestWrapper中的方法
/**
* 获取所有参数名
*
* @return 返回所有参数名
*/
@Override
public Enumeration<String> getParameterNames() {
Vector<String> vector = new Vector<String>(params.keySet());
return vector.elements();
}
/**
* 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
*
* @param name 指定参数名
* @return 指定参数名的值
*/
@Override
public String getParameter(String name) {
Object v = this.params.get(name);
if (v == null)
return null;
if (v instanceof String[]) {
String[] strArr = (String[]) v;
if (strArr.length > 0) {
return strArr[0];
}
return null;
}
if (v instanceof String) {
return (String) v;
}
return v.toString();
}
/**
* 获取指定参数名的所有值的数组,如:checkbox的所有数据
* 接收数组变量 ,如checkobx类型
*/
@Override
public String[] getParameterValues(String name) {
Object v = this.params.get(name);
if (v == null)
return null;
if (v instanceof String[])
return (String[]) v;
if (v instanceof String) {
return new String[] { (String) v };
}
return new String[] { v.toString() };
}
@Override
public Map getParameterMap() {
return this.params;
}
}
3.在web.xml文件中配置去空格过滤器,并设置要对所有的请求进行过滤:
<!-- 配置去空格过滤器 -->
<filter>
<filter-name>ParameterTrimFilter</filter-name>
<filter-class>com.text.filter.ParameterTrimFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ParameterTrimFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>