zoukankan      html  css  js  c++  java
  • Web 过滤器参数设置问题

    问题描述:

    在代码定义了3个过滤器,分别为filter1,filter2,filter3,过滤的Servlet范围分别是"/*","/Servlet1","/Servlet1",只在filter3种配置了初始化参数
    
    预设结果为:

        filter1...进...
        filter2...进...
        filter3...进...
        com.roxy_filter.Filter3
        hello
        filter3...出...
        filter2...出...
        filter1...出...

     

      运行结果却是:

        filter1...进...
        filter2...进...
        filter2...出...
        filter1...出...

    问题代码:

    @WebFilter(filterName="filter3", servletNames="/Servlet1",   
            initParams={  
                    @WebInitParam(name="ok", value="hello")
        }  
    ) 


    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

      System.out.println("filter3...进...");


      System.out.println(Thread.currentThread().getStackTrace()[1].getClassName());
      String v = fConfig.getInitParameter("ok");
      System.out.println(v);

    
    

      chain.doFilter(request, response);

      System.out.println("filter3...出...");
    }

    
    

    问题分析:

    首先将filter3的@WebFilter声明改为和filter2一致,输出正常,说明doFilter()方法没有问题

    仔细查看文档,发现有两个参数:
      servletNames String[]:指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name> 的取值
      urlPatterns :指定要过滤的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
    所以将servletNames="/Servlet1"改为urlPatterns ="/Servlet1",表明只对Servlet1进行过滤,运行,结果正确
    
    

    问题解决:

    @WebFilter(filterName="filter3", urlPattens="/Servlet1",   
            initParams={  
                    @WebInitParam(name="ok", value="hello")
        }  
    ) 

    问题总结:

    web3.0 之后,对于servlet,filter,listener有两种配置方式,一种是在web.xml种进行传统的配置,另一种是直接在类种进行注解式声明

    @WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 )

    属性名 类型 描述
    filterName String 指定过滤器的 name 属性,等价于 <filter-name>
    value String[] 该属性等价于 urlPatterns 属性。但是两者不应该同时使用
    urlPatterns String[] 指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签
    servletNames String[] 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name> 的取值
    dispatcherTypes DispatcherType 指定过滤器的转发模式。具体取值包括:
    ASYNC、ERROR、FORWARD、INCLUDE、REQUEST
    initParams WebInitParam[] 指定一组过滤器初始化参数,等价于 <init-param> 标签
    asyncSupported boolean 声明过滤器是否支持异步操作模式,等价于 <async-supported> 标签
    description String 该过滤器的描述信息,等价于 <description> 标签
    displayName String 过滤器的显示名,通常配合工具使用,等价于 <display-name> 标签
  • 相关阅读:
    NDCG
    卷积核
    高斯核函数映射到无限维
    《Towards Knowledge-Based Recommender Dialog System》阅读笔记
    Pytorch官方教程:含注意力的seq2seq2机器翻译
    cad 已知拱高弦长求弧长
    MySQL直接将数据库的文件夹从服务器复制到本地,打开表提示需要修复 “is marked as crashed and should be repaired ”
    CSS小技巧:利用border实现三角形箭头
    完美解决ERROR 1064 (42000): You have an error in your SQL syntax; check the manual…
    Java 理论与实践:正确使用 Volatile 变量
  • 原文地址:https://www.cnblogs.com/roxy/p/7487218.html
Copyright © 2011-2022 走看看