zoukankan      html  css  js  c++  java
  • 使用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 }
  • 相关阅读:
    luogu1197 [JSOI2008]星球大战
    luogu2085 最小函数值
    Vijos 1144 小胖守皇宫 【树形DP】
    洛谷 P1941 飞扬的小鸟 【DP+众多特判】
    codevs 1516 平均分数 【数学推理+求逆序对】
    tyvj 1936 太空战队 【强连通分量】
    USACO 2.4 Overfencing 【种子染色法+递推】
    code[vs] 2488 绿豆蛙的归宿【反向拓扑+DP】
    USACO 2.3 Zero Sum 【搜索+字符串处理+模拟计算】
    USACO 2.3 Cow Pedigrees 【DP+前缀和优化】
  • 原文地址:https://www.cnblogs.com/qrlozte/p/3178454.html
Copyright © 2011-2022 走看看