全站编码过滤器EncodingFilter

来源:互联网 发布:吸烟罚款 知乎 编辑:程序博客网 时间:2024/05/18 21:47
import java.io.IOException;import java.util.Map;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.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class EncodingFilter implements Filter {    private FilterConfig config = null;    private String encode = null;        public void destroy() {           }    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        response.setContentType("text/html;charset="+encode); //--解决响应乱码        //--包装改造request中和获取请求参数相关的方法解决请求参数乱码        chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);    }       public void init(FilterConfig filterConfig) throws ServletException {        this.config = filterConfig;        encode = config.getInitParameter("encode") == null?"utf-8":config.getInitParameter("encode");    }    //内部类,装饰类改造HttpServletRequest   的三个方法    class MyHttpServletRequest extends HttpServletRequestWrapper{        private HttpServletRequest request = null;        private boolean isNotEncode = true;        public MyHttpServletRequest(HttpServletRequest request) {            super(request);            this.request = request;        }               @Override        public Map getParameterMap() {            try{                if(request.getMethod().equalsIgnoreCase("POST")){//--如果是post提交,一行代码解决post提交请求参数乱码                    request.setCharacterEncoding(encode);                    return request.getParameterMap();                }else if(request.getMethod().equalsIgnoreCase("GET")){//--如果是get提交,则应该手动编解码解决乱码                    Map<String,String[]> map = request.getParameterMap();//获取有乱码的map                    if(isNotEncode){//只能在第一次解决乱码                        for(Map.Entry<String, String[]> entry : map.entrySet()){//遍历map,解决所有值的乱码                            String [] vs = entry.getValue();                            for(int i=0;i<vs.length;i++){                                vs[i] = new String(vs[i].getBytes("iso8859-1"),encode);                            }                        }                        isNotEncode = false;//设置为false,第二次就不会再进这个代码块了                    }                    return map;                }else{                    return request.getParameterMap();                }            }catch (Exception e) {                e.printStackTrace();                throw new RuntimeException(e);            }        }               @Override        public String[] getParameterValues(String name) {            return (String[]) getParameterMap().get(name);        }               @Override        public String getParameter(String name) {            return getParameterValues(name) == null ? null : getParameterValues(name)[0];        }    }}


在xml文件重配置过滤器的拦截路径

    <filter>        <description>全站乱码过滤器</description>        <filter-name>encodeFilter</filter-name>        <filter-class>com.java.filter.EncodingFilter</filter-class>        <init-param>            <param-name>encode</param-name>            <param-value>utf-8</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>encodeFilter</filter-name>        <url-pattern>/*</url-pattern> -----------------------------------------拦截的路径    </filter-mapping>




0 0
原创粉丝点击