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 }
  • 相关阅读:
    一步一步实现一个简单的OS(简单的让boot载入setup)
    hdu 1203 I NEED A OFFER!(01背包)
    面向服务与微服务架构
    ThreadLocal,LinkedBlockingQueue,线程池 获取数据库连接2改进
    deeplearning.net 0.1 document
    怎样有效的降低反复的代码
    redmine 自己定义字段mysql表结构
    c语言中使用宏,需要注意的的几点
    gcc自有的define语法,解决变量多次自加的问题
    ubuntu16.04 安装docker
  • 原文地址:https://www.cnblogs.com/qrlozte/p/3178454.html
Copyright © 2011-2022 走看看