
Spring Boot、Spring Web和Spring MVC等其他框架,都提供了很多servlet 过滤器可使用,我们需要在配置文件中定义这些过滤器为bean对象。现在假设我们的应用程序运行在一台负载均衡代理服务器后方,因此需要将代理服务器发来的请求包含的IP地址转换成真正的用户IP。Tomcat 8 提供了对应的过滤器:RemoteIpFilter。通过将RemoteFilter这个过滤器加入过滤器调用链即可使用它。
How Do
一般在写简单的例子时,不需要单独定义配置文件,只需要将对应的bean对象定义在Application类中即可。正式的项目中一般会有单独的web配置文件,我们在项目的com.test.bookpub(与BookpubApplication.java同级)下建立WebConfiguration.java文件,并用@Configuration注解修饰。
package com.test.bookpub
import org.apache.catalina.filters.RemoteIpFilter
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
public class WebApplication {
@Bean
public RemoteIpFilter remoteIpFilter() {
return new RemoteIpFilter()
}
}
通过mvn spring-boot:run启动项目,可以在终端中看到如下的输出信息,证明RemoteIPFilter已经添加成功。
RemoteIPFilter
分析
项目的主类——BookPubApplication,可以看到由@SpringBootApplication注解修饰,这包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。在Spring Boot的自动配置、Command-line Runner一文中曾对这个三个注解做详细解释,@ComponentScan让Spring Boot扫描到WebConfiguration类并把它加入到程序上下文中,因此,我们在WebApplication中定义的Bean就跟在BookPubApplication中定义一样。
方法@Beanpublic RemoteIpFilter remoteIpFilter() { ... }返回一个RemoteIPFilter类的spring bean。当Spring Boot监测到有javax.servlet.Filter的bean时就会自动加入过滤器调用链。从上图中还可以看到,该Spring Boot项目一次加入了这几个过滤器:characterEncodingFilter(用于处理编码问题)、hiddenHttpMethodFilter(隐藏HTTP函数)、httpPutFormContentFilter、requestContextFilter(请求上下文),以及我们刚才自定义的RemoteIPFilter。
JAVA &&Spring &&SpringBoot2.x — 学习目录
SpringBoot 关于Filter、Servlet、Listener配置—官网
在使用嵌入式容器中(内置Tomcat),类上含有 @WebServlet 、 @WebFilter 和 @WebListener 注解时,可以通过启动类上的 @ServletComponentScan 注解进行扫描。
需要注意的是:@ServletComponentScan 在独立容器中没有任何效果,而是使用容器的内置发现机制。
任何的 Servlet 、 Filter 或者 Listener 实例都是在容器中注册的,可以使用 @Component 或者 @Bean 。
默认情况下,如果上下文只包含一个Servlet,则将其映射为 / ,在多个Servlet bean的情况下,bean名称用作路径前缀,过滤器映射到 /* 。
自定义Filter通过@Bean注解后,被SpringBoot自动注册到容器的Filter chain中,并且拦截路径为 /* ,这样导致的结果是:所有的URL都会被自定义的Filter过滤。
可以使用 ServletRegistrationBean 、 FilterRegistrationBean 以及 ServletListenerRegistrationBean 类进行完全的控制。
Spring Boot对Filter、Servlet提供了相应的注册类,来进行精细化的配置,我们可以使用注册类来取消Filter的自动注册。
1、基础准备
2、编写Filter
此处我们重点关注 doFilter方法 ,编写实现类重写该方法。
Ⅰ 在自定义Filter实现类上使用@WebFilter注解;
Ⅱ 自定义filterName(随意,不要与其他Filter重复即可);
Ⅲ 定义urlPatterns此处设置为"/*",表示拦截所有请求;
Ⅰ 将传入的 request 与 response 对象转换为 Http类型 ;
Ⅱ 自定义不需要处理的URI数组
Ⅲ 获取请求URI
Ⅳ 判断本次请求
封装checkURI方法,如下:
a、注入PATH_MATCHER,用于路径比较,如下:
b、方法体,如下:
Ⅴ 不需要拦截,则直接放行
Ⅵ 其余路径,判断登录状态
a、已登录,则放行
BaseContext是自定义存储线程userId的类
b、未登录,拦截
自定义常量
拦截,此处使用response向前端返回响应数据R.error(NOT_LOGIN)
3、扫描Filter
在启动类上添加 @ServletComponentScan注解 ,用于扫描 @WebFilter 注解 ,如下:
4、测试
编写Controller类,启动测试。
以上即为Filter基础使用的内容,感谢阅读。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)