使用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<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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容