利用过滤器实现全局编码

来源:互联网 发布:java解析http请求 编辑:程序博客网 时间:2024/06/02 02:40

一般在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<String, String[]> map = getParameterMap();        return map.get(name)[0];    }    @Override    public String[] getParameterValues(String name) {        Map<String, String[]> map = getParameterMap();        return map.get(name);    }    private boolean flag = true;    @Override    public Map<String, String[]> getParameterMap() {        Map<String, String[]> map = super.getParameterMap();// 可能乱码  调用原始的方法        //下面是对通过调用原始map集合里面的数据进行 编码         if (flag) {            for (Map.Entry<String, String[]> 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;    }}
原创粉丝点击