• 使用filter导致服务器返回的页面始终是空白---在doFilter中漏写了chain.doFilter()


    今天调代码的时候,突然发现,服务器开着,什么都没有问题,当我把下面这个filter给deploy了以后,访问所有的页面就都是空白。

    后来发现,是因为在代码路径中,有一条路径没有调用filterChain.doFilter(request, response),想来也是,你这不就等于把HttpServletRequest给丢失了么

    web.xml中,在enable="false"的情况下,会出现我上面描述的问题,代码如下

     1 package org.foo.filterdemo ;
     2 
     3 import java.io.* ;
     4 
     5 import javax.servlet.* ;
     6 
     7 public class SimpleFilter implements Filter {
     8     
     9     private boolean enable = false;
    10     
    11     public void init(FilterConfig config)
    12           throws ServletException{
    13         String enableString = config.getInitParameter("enable");
    14         if (enableString != null && enableString.equalsIgnoreCase("true")) {
    15             this.enable = true;
    16         }
    17         String initParam = config.getInitParameter("ref") ;
    18         try {
    19             initParam = new String(initParam.getBytes("iso-8859-1"), "UTF-8");
    20         } catch (UnsupportedEncodingException e) {
    21             e.printStackTrace();
    22         }
    23         System.out.println(this + ": init(), init-param = " + initParam);
    24     }
    25     public void doFilter(ServletRequest request,
    26               ServletResponse response,
    27               FilterChain chain)
    28               throws IOException,
    29                      ServletException{
    30         if (this.enable) {
    31             System.out.println(this + ": doFilter()") ;
    32             chain.doFilter(request, response);
    33         } else {
    34             // chain.doFilter(request, response); // 如果你发现页面始终是空白,问题就出在这里,不能缺少这行代码
    35         }
    36     }
    37     public void destroy(){
    38         // clean up
    39         System.out.println(this + ": destroy()");
    40     }
    41 }

    web.xml

      注意enable选项为false的时候,如果上面被注释掉的代码没取消注释,那么就会出问题,因为这里的url-pattern设置了此filter对站点的所有页面都要起作用

     1    <filter> 
     2         <filter-name>simple-filter</filter-name> 
     3         <filter-class>org.foo.filterdemo.SimpleFilter</filter-class> 
     4         <init-param> 
     5             <param-name>enable</param-name> 
     6             <param-value>true</param-value> 
     7         </init-param>
     8         <init-param> 
     9             <param-name>ref</param-name> 
    10             <param-value>这是一串中文,给SimpleFilter的</param-value> 
    11         </init-param>  
    12     </filter>
    13     <filter-mapping>
    14         <filter-name>simple-filter</filter-name>
    15         <url-pattern>/*</url-pattern>
    16     </filter-mapping>

    实际上,由于chain.doFilter()是不可缺少的,因此添加了enable参数的filter的代码应该这样写:

    1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    2             throws IOException, ServletException{
    3         if (this.enable) {
    4             // do some work
    5         }
    6         chain.doFilter(request, response);
    7 }
  • 相关阅读:
    编程之美 2014资格赛 格格取数
    ios游戏开发--cocos2d学习(1)
    ios开发中常用的也是最基本的mysql语句
    无限树形结构的数据库表设计
    认真的辞职
    几种JavaScript富应用MVC MVVM框架
    javascript创建对象和属性的几种方式
    webresource.axd文件的配置及使用
    ITextSharp用来生成 PDF 的一个组件
    flexpaper 开源轻量级的在浏览器上显示各种文档的组件
  • 原文地址:https://www.cnblogs.com/qrlozte/p/3178454.html
Copyright © 2020-2023  润新知