一:原理
- 1.對於Post方式提交的資料,我們可以通過直接設定request和response的編碼方式來解決亂碼問題;但是Get方式提交的資料,那麼就需要編碼再解碼的方式解決亂碼問題。
- 2.我們一般對於GET請求獲取引數有兩個常用方法:
request.getParameter(String name)是獲得相應名的資料,如果有重複的名,則返回第一個的值 . 接收一般變數 ,如text型別。
request.getParameterValues(String name)是獲得如checkbox類(名字相同,但值有多個)的資料。 接收陣列變數 ,如checkobx型別 。- 3.所以我們的思路就是重寫上述這兩個方法,達到解決GET取參亂碼問題。
二:程式碼
package cn.zyzpp.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* 指定過濾器的名稱以及過濾的內容
* 單個頁面可用urlPatterns="/advice"
* 多個頁面可用urlPatterns={"/advice","/advice"}
* @author www.zyzpp.cn
*
*/
@WebFilter(filterName="filter", urlPatterns="/*")
public class FilterImpl implements javax.servlet.Filter {
private String encoding="UTF-8";
public FilterImpl() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//1 解決中文亂碼問題:1)只能解決POST亂碼2)響應亂碼
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
//2 建立自定義的Request物件 :解決get亂碼
MyRequest myRequest = new MyRequest((HttpServletRequest) request);
//3 放行
chain.doFilter(myRequest, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
- 繼承HttpServletRequestWrapper類 , 重寫getParameter()和 getParameterValues()方法
package cn.zyzpp.filter;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 繼承HttpServletRequestWrapper
* 重寫getParameter()和 getParameterValues()方法
* @author www.zyzpp.cn
*/
public class MyRequest extends HttpServletRequestWrapper {
public MyRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (super.getMethod().equalsIgnoreCase("GET")&&value!=null) {
try {
value = new String(value.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (super.getMethod().equalsIgnoreCase("GET")&&values!=null) {
try {
int i=0;
for (String value : values) {
values[i++] = new String(value.getBytes("ISO-8859-1"), "utf-8");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return values;
}
}
本篇部落格借鑑於:
http:// blog.csdn.net/melissa_heixiu/article/details/52705457
http:// blog.csdn.net/csdn_gia/article/details/54094426
可以看到,第一篇部落格的思想是利用的req.getParameterMap()來獲取到單個或多個引數;第二篇部落格較簡單,重寫了request.getParameter()。
筆者比著葫蘆畫瓢,增加了request.getParameterValues()方法,並解決了引數為空導致的自定義Request類空指標異常。