统一全站字符编码的过滤器
原理:通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题
知识:
由于开发人员在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把
包装对象传给目标资源,从而实现一些特殊需求。
package com.jjyy.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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;
import javax.servlet.http.HttpServletRequestWrapper;
public class EncodeFilter implements Filter {
private FilterConfig config = null;
private String encode = null;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//响应的乱码处理
response.setContentType("text/html;charset=utf-8");
//装饰
chain.doFilter(new MyHttpServletRequest((HttpServletRequest)request), response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.encode = config.getInitParameter("encode")==null?"utf-8":config.getInitParameter("encode");
}
//请求乱码的处理
class MyHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request = null;
boolean isNotEncode = true;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public Map getParameterMap() {
try {
if(request.getMethod().equalsIgnoreCase("POST")){
request.setCharacterEncoding(encode);
return request.getParameterMap();
}else if(request.getMethod().equalsIgnoreCase("GET")){
//request.getParameterMap()第一次会解决,然后缓存起来
//request.getParameterMap()第二次直接从缓存中的map
Map<String,String[]> map = request.getParameterMap();
if(isNotEncode){
for(Map.Entry<String, String[]> entry:map.entrySet()){
String [] vs = entry.getValue();
for(int i=0;i<vs.length;i++){
vs[i]= new String(vs[i].getBytes("iso8859-1"),encode);
}
}
isNotEncode = false;
}
return map;
}else{
return request.getParameterMap();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
return getParameterValues(name)==null?null:getParameterValues(name)[0];
}
@Override
public String[] getParameterValues(String name) {
return (String[])getParameterMap().get(name);
}
}
}