乱码过滤器 tomcat7 乱码处理后 servlet 跳转 空白页 wrapper包装request 后 无法取值

一下是过滤器处理tomcat 7 乱码问题

@WebFilter("/*") // 过滤所有资源
public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 基于HTTP
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        request.setCharacterEncoding("UTF-8");
        // 得到请求类型 (GET|POST)
        String method = request.getMethod();
        // 如果是GET请求,则判断服务器版本
        if ("GET".equalsIgnoreCase(method)) { // 忽略大小写比较
            // 得到服务器版本
            String serverInfo = request.getServletContext().getServerInfo(); // Apache Tomcat/7.0.79
            // 通过截取字符串,得到具体的版本号
            String version = serverInfo.substring(serverInfo.indexOf("/")+1,serverInfo.indexOf("."));
            // 判断服务器版本是否是Toncat7级以下
            if (version != null && Integer.parseInt(version) < 8) {
                // Tomcat7及以下版本的服务器的GET请求
                MyWrapper myRequest = new MyrWrapper(request);
                // 放行资源
                //String name  = myRequest.getRequestURI();
                //String a = myRequest.getServletPath();
                 myRequest.setAttribute("flag","myRequest");
                 request.setAttribute("flag","request");
                 filterChain.doFilter(myRequest, response);
                return;
            }
        }
        // 处理POST请求 (只针对POST请求有效,GET请求不受影响)


        filterChain.doFilter(request,response);
    }


    /**
     * 1. 定义内部类 (类的本质是request对象)
     * 2. 继承 HttpServletRequestWrapper包装类
     * 3. 重写getarameterP()方法
     */
    class MyWrapper extends HttpServletRequestWrapper {

        // 定义成员变量 HttpServletRequest对象 (提升构造器中request对象的作用域)
        private HttpServletRequest request;

        /**
         * 带参构造
         *  可以得到需要处理的request对象
         * @param request
         */
        public MyWrapper(HttpServletRequest request) {
            super(request);

            this.request = request;
        }

        /**
         * 重写getParameter方法,处理乱码问题
         * @param name
         * @return
         */
        @Override
        public String getParameter(String name) {
            // 获取参数 (乱码的参数值)
            String value = request.getParameter(name);
            // 判断参数值是否为空
            if (StrUtil.isBlank(value)) {
                return value;
            }
            // 通过new String()处理乱码
            try {
                value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return value;
        }
    }


    @Override
    public void destroy() {

    }
}

注意:注意这段代码的问题,在请求转发经过tomcat7 的那一段判断版本的if代码后显示空白页面,原因是经过wrapper过滤重新包装后,无法取得request参数值,主要错误原因是在重写的MyWrapper类中添加了私有成员request,request.getparameter就会调用原生方法,而不是调用wrapper中的getparameter方法,所以无法访问到request的属性值。改正如下:

class MyWrapper extends HttpServletRequestWrapper {

        /**
         * 带参构造
         *  可以得到需要处理的request对象
         * @param request
         */
        public MyWrapper(HttpServletRequest request) {
            super(request);

        
        }

        /**
         * 重写getParameter方法,处理乱码问题
         * @param name
         * @return
         */
        @Override
        public String getParameter(String name) {
            // 获取参数 (乱码的参数值)
            String value = super.getParameter(name);
            // 判断参数值是否为空
            if (StrUtil.isBlank(value)) {
                return value;
            }
            // 通过new String()处理乱码
            try {
                value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
                System.out.println("encodingfilter  decode utf-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return value;
        }
    }

 注意:在获取request对象中的属性的时候,可以先判断是否为空,抛出异常,这样页面空白或者无法访问时容易定位bug位置。

注意:在filter 中请求转发只要复合过滤规则还会再次进入过滤器,再一次的条件注意要与请求转发的条件不同,避免死循环。

tomcat 空白页 没有任何信息的原因最有可能是:提交到的servlet 的参数缺省,或者是servlet里没有写收到请求并处理请求的对应函数。

你可能感兴趣的:(tomcat7,servlet,服务器,前端,java)