由于请求方式get和post的解决乱码方式是不一样的。
- post请求方式的参数是存放在消息体中,可以通过setCharacterEncoding()方法来解决
- get请求方式的参数是存放在消息头中,必须通过获取URL参数才能进行设置,为此,可以从写相应的方法来设置编码
这时候,就要使用到包装类。HttpServletRequestWrapper作为request对象的包装类,采用了装饰设计模式。所谓装饰设计模式就是通过包装类的方法,增强类的某个功能。
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);
//处理响应乱码
response.setContentType("text/html;charset=utf-8");
//传递的是加强后的request
chain.doFilter(enhanceRequest, resp);
}
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
}
//使用HttpServletRequestWrapper包装类,增强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();
//确保手动编码只进行一次
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;
}
}