用戶在使用系統時有意無意可能會輸入空格,一般來說在字符串首尾的空格都是無意義的(密碼值除外),所以在使用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>