由于請求方式get和post的解決亂碼方式是不一樣的。
- post請求方式的參數(shù)是存放在消息體中,可以通過setCharacterEncoding()方法來解決
- get請求方式的參數(shù)是存放在消息頭中,必須通過獲取URL參數(shù)才能進(jìn)行設(shè)置,為此,可以從寫相應(yīng)的方法來設(shè)置編碼
這時候,就要使用到包裝類。HttpServletRequestWrapper作為request對象的包裝類,采用了裝飾設(shè)計模式。所謂裝飾設(shè)計模式就是通過包裝類的方法,增強(qiáng)類的某個功能。
public class EncodingFilter implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest enhanceRequest = new EnhanceRequest(request);
//處理響應(yīng)亂碼
response.setContentType("text/html;charset=utf-8");
//傳遞的是加強(qiáng)后的request
chain.doFilter(enhanceRequest, resp);
}
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
}
//使用HttpServletRequestWrapper包裝類,增強(qiáng)getParameterMap()等方法
class EnhanceRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private boolean hasEncoded;
public EnhanceRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public Map<String, String[]> getParameterMap() {
//獲取請求的方式
String method = request.getMethod();
//判斷請求方式,不同方式不同的處理
if (method.equalsIgnoreCase("post")){
try {
request.setCharacterEncoding("UTF8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}else if (method.equalsIgnoreCase("get")){
Map<String,String[]> parameterMap = request.getParameterMap();
//確保手動編碼只進(jìn)行一次
if (!hasEncoded){
for (String parameterName : parameterMap.keySet()){
String[] values = parameterMap.get(parameterName);
if (values != null){
for (int i=0;i<values.length;i++){
try {
//重新編碼
values[i] = new String(values[i].getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncoded = true;
}
return parameterMap;
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
Map<String,String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null){
return null;
}
return values[0];
}
@Override
public String[] getParameterValues(String name) {
Map<String,String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null){
return null;
}
return values;
}
}