全站统一字符编码的几种方式

来源:互联网 发布:如何用手机检查网络 编辑:程序博客网 时间:2024/06/05 09:28

统一字符编码

装饰设计模式

import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.Map;public class EncodingFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {        //强转        HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) resp;        //放行        chain.doFilter(new MyRequest(request), response);    }    public void init(FilterConfig config) throws ServletException {    }}class MyRequest extends HttpServletRequestWrapper {    private HttpServletRequest request;    //同一个对象只进行一次编码处理    private boolean flag = true;    public MyRequest(HttpServletRequest request) {        super(request);        this.request = request;    }    @Override    public String getParameter(String name) {        if (name == null || name.trim().length() == 0) {            return null;        }        String[] values = getParameterValues(name);        if (values == null || values.length == 0) {            return null;        }        return values[0];    }    @Override    public String[] getParameterValues(String name) {        if (name == null || name.trim().length() == 0) {            return null;        }        Map<String, String[]> map = getParameterMap();        if (map == null || map.size() == 0) {            return null;        }        return map.get(name);    }    @Override    public Map<String, String[]> getParameterMap() {        //截获表单访问方式        String method = request.getMethod();        Map<String, String[]> map = null;        if (method.equalsIgnoreCase("POST")) {            try {                request.setCharacterEncoding("UTF-8");                map = request.getParameterMap();                return map;            } catch (UnsupportedEncodingException e) {                e.printStackTrace();            }        } else if (method.equalsIgnoreCase("GET")) {            map = request.getParameterMap();            if (flag) {                for (String key : map.keySet()) {                    String[] values = map.get(key);                    for (int i = 0; i < values.length; i++) {                        try {                            String value = new String(values[i].getBytes("ISO8859-1"), "UTF-8");                            values[i] = value;                        } catch (UnsupportedEncodingException e) {                            e.printStackTrace();                        }                    }                    map.replace(key, values);                    return map;                }                flag = false;            }        }        return super.getParameterMap();    }}

使用代理

import java.io.IOException;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;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.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;@WebFilter(urlPatterns="/*")public class GenericCharacterEncodingFilter implements Filter{    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        final HttpServletRequest req = (HttpServletRequest) request;        // 对req产生代理对象:        HttpServletRequest myReq = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),req.getClass().getInterfaces(), new InvocationHandler() {            @Override            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                // 增强getParameter:                if("getParameter".equals(method.getName())){                    // 增强.                    // 根据请求方式:                    String type = req.getMethod();                    if("get".equalsIgnoreCase(type)){                        // 调用原有的getParameter:                        String value = (String)method.invoke(req, args);                        String s = new String(value.getBytes("ISO-8859-1"),"UTF-8");                        return s;                    }else if("post".equalsIgnoreCase(type)){                        req.setCharacterEncoding("UTF-8");                        return method.invoke(req, args);                    }                }                // 不增强:                return method.invoke(req, args);                }        });        chain.doFilter(myReq, response);    }    @Override    public void destroy() {    }}
原创粉丝点击