利用过滤器实现全局编码

一般在servlet 得到表单的数据的时候,都是 request.getParameter(name);来得到的,这有时候会得到乱码,所以用request.setCharacterEncoding(); 来设置,但是也只能解决post方式提交的,所以使用过滤器来统一解决,解决思路就是我自己有一个request 对象一些getParameter方法,里面处理好了编码,你调用我就可以了,以后调用request.getParameter(name)就是包装后的request对象和包装后的方法,是通过过滤器传递过来包装后的request对象!
Filter类 实际上对request 进行包装
public void doFilter(ServletRequest request, ServletResponse arg1,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request
req=new MyRequest(req); 相当于MyRequest myreq=new MyRequest(req);
filterChain.doFilter(req, arg1);//把包装好啊的request传递给servlet

MyRequest类

public class MyRequest extends HttpServletRequestWrapper {
    HttpServletRequest request;
    public MyRequest(HttpServletRequest request) {
        super(request);
        this.request=request;
    }
    @Override
    public String getParameter(String name) {
        Map map = getParameterMap();
        return map.get(name)[0];
    }

    @Override
    public String[] getParameterValues(String name) {
        Map map = getParameterMap();
        return map.get(name);
    }

    private boolean flag = true;

    @Override
    public Map getParameterMap() {
        Map map = super.getParameterMap();// 可能乱码 调用原始的方法
        //下面是对通过调用原始map集合里面的数据进行 编码 
        if (flag) {
            for (Map.Entry m : map.entrySet()) {
                String[] values = m.getValue();
                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();
                    }
                }

            }
            flag = false;
        }
        return map;

    }

}

你可能感兴趣的:(过滤器用户验证)