@WebFilter和@Component
本文你主要讲解@WebFilter注解和@Component以及在使用过程中遇到的坑
这是代码中出现的一个问题。这里讲一下原因
@WebFilter
1.基本概念:
@WebFilter用于将一个类声明为过滤器,该注解将会在部署时候被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的常用属性(以下所有属性均为可选属性,但是value、urlPatterns、servletNames三者必须至少包含一个,且value和urlPatterns不能共存,如果同同时制定,通常忽略value的值)
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的name属性,等价于< filter-name> |
value | String[] | 该属性等价于urlPatterns属性,但是两个不应该同时使用 |
urlPatterns | String[] | 指定一组过滤器的URL匹配模式。等价于< url-pattern> |
sevletNames | String[] | 指定过滤器将用于哪些servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中< servlet-name> |
dispatcherTypes | DispatcheType | 指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST |
initParams | WebInitParam[] | 指定一组过滤器初始化参数,等价于< init-param> |
asyncSupported | boolean | 声明过滤器是否支持异步操作模式,等价于< async-supported>标签 |
description | String | 该过滤器的描述信息,等价于< description> |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于< display-name> |
原因:
@Component
@component: 标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的)
采坑记录
由于业务需要使用Filter。大体逻辑如下:
①通过WebFilter进行Filter声明,这样容器在进行部署的时候就会处理该Filter,创建实例并创建配置对象FilterConfig,然后会将该Filter应用到urlPatterns所指定的url;
②在init方法中获取到初始化参数,自定义的excludedUrls,作为成员在后续执行过滤逻辑的时候使用;
③在doFilter中进行url的鉴定,如果需要执行认证鉴权处理,则执行相应逻辑。不满足条件的情况下重定向到登录页;
④Filter类增加Component注解,让该Filter被容器管理。
问题就出在第一步和第四步。urlPatterns指定的URL不起作用,所有的请求都会经过过滤器,
然后在SpringBoot的Application中增加注解@ServletComponentScan,这样容器会扫描到@Component注解的Filter。
解决办法:
在这种情况下,去掉了@Component注解,再次启动服务。查看日志,发现该Filter仅被映射一次,通过浏览器访问相应的url也表现正确。