使用Filter来统一全站编码

由于请求方式get和post的解决乱码方式是不一样的。

  1. post请求方式的参数是存放在消息体中,可以通过setCharacterEncoding()方法来解决
  2. 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 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 parameterMap = request.getParameterMap();
            //确保手动编码只进行一次
            if (!hasEncoded){
                for (String parameterName : parameterMap.keySet()){
                    String[] values = parameterMap.get(parameterName);
                    if (values != null){
                        for (int i=0;i parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values ==  null){
            return null;
        }
        return values[0];
    }
    @Override
    public String[] getParameterValues(String name) {
        Map parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values ==  null){
            return null;
        }
        return values;
    }
}

你可能感兴趣的:(使用Filter来统一全站编码)