SpringBoot整合Filter
在传统的web开发时,我们创建一个Filter,需要在web.xml里做配置:
<filter> <filter-name>FirstFilter</filter-name> <filter-class>com.linhw.demo.filter.MyFirstFilter</filter-class> </filter> <filter-mapping> <filter-name>FirstFilter</filter-name> <url-pattern>/filter</url-pattern> </filter-mapping>
样每新增一个Filter类都要在web.xml增加一段类似的配置,很繁琐,降低了开发的效率。
SpringBoot提供了两种方式来解决这个问题:
- 通过注解扫描完成 Filter 组件的注册
- 通过方法完成 Filter 组件的注册
引入依赖:
<!-- 核心启动器, 包括auto-configuration、logging and YAML --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- building web, including RESTful, applications using Spring MVC. 使用Tomcat作为嵌入式容器, @RestController由这个starter提供--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
一、通过注解扫描完成 Filter 组件的注册
@WebFilter(filterName="FirstFilter", urlPatterns={"/filter"}) public class MyFirstFilter implements Filter{ /** * web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取配置信息,完成对象的初始化功能, * 从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。 * 开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 */ @Override public void init(FilterConfig filterConfig) throws ServletException { } /** * 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时, * Servlet容器将先调用过滤器的doFilter方法。 * FilterChain用户访问后续过滤器。 */ @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("MyFirstFilter 进入......"); arg2.doFilter(arg0, arg1); System.out.println("MyFirstFilter 离开......"); } /** * Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 */ @Override public void destroy() { } }
@WebFilter注解的属性详解:
- filterName:类型String,指定过滤器的name属性,等价于<filter-name>。
- value:类型String[],等价于urlPatterns属性,但是两者不应该同时使用。
- urlPatterns:类型String[],指定一组过滤器的URL匹配模式。等价于<url-pattern>标签。
- servletNames:类型Stirng[],指定过滤器将应用于哪些Servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中<servlet-name>的取值。
- dispatcherTypes:类型DispatcherType,指定过滤器的转发模式
- initParams:类型WebInitParam[],指定一组过滤器的初始化参数,等价于<init-param>标签。
- asyncSupported:类型boolean,声明过滤器是否支持异步操作模式,等价于<async-supported>。
- description:类型String,过滤器的描述信息,等价于<description>标签。
- displayName:类型String,过滤器的显示名,通常配合工具使用,等价于<display-name>标签。
用注解的方式必须在SpringBoot启动类增加@ServletComponentScan注解,这样SpringBoot 启动时会扫描@WebFilter,实例化这些类。
二、通过方法完成 Filter 组件的注册
/** * 区别于第一种方式,没有使用注解 */ public class MySecondFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("SecondFilter 进入......"); arg2.doFilter(arg0, arg1); System.out.println("SecondFilter 离开......"); } @Override public void destroy() { } }
这种方式需要在配置类上以@Bean的形式注入到Spring容器中。
@Configuration public class BootConfig { /** * 使用@Bean注解将名为"getFilter"的bean加入到容器 */ @Bean public FilterRegistrationBean getFilter(){ FilterRegistrationBean secondFilter = new FilterRegistrationBean(new MySecondFilter()); secondFilter.addUrlPatterns(new String[]{"/filter"}); return secondFilter; } }
时刻与技术进步,每天一点滴,日久一大步!!!
本博客只为记录,用于学习,如有冒犯,请私信于我。