前言
温馨提醒:希望读者了解Spring拦截器和Servlet过滤器基础知识
目录
Spring拦截器基础知识https://blog.csdn.net/Dreamkidya/article/details/141825688?spm=1001.2014.3001.5501
Servlet过滤器基础知识https://blog.csdn.net/Dreamkidya/article/details/141292492?spm=1001.2014.3001.5501
位置和层面
- Servlet过滤器(Filter)
- Filter是servlet规范的一部分,属于javaEE标准,它位于servlet容器层面上,可以对几乎所有的请求进行拦截
- 它是在DispatcherServlet之前执行 的,因此它的作用范围更广
- Spring拦截器(Interceptor)
- Interceptor是Spring框架的一部分,属于SPring的层面.他主要针对SPring的控制器进行拦截,通常用于对HanderMapping确定的请求进行拦截
- Interceptor只处理经过DispatcherServlet的请求,因此它的范围小
使用场景
-
Servlet过滤器(Filter)
- Filter通常用于通用的,与Web应用程序整体相关的功能.例如:编码设置,登录验证,权限检查,跨域问题处理,日志记录.
- Filter可以拦截所有的请求类型,适合做一些全局性处理.
-
Spring拦截器
- Interceptor更适合于与业务逻辑紧密相关的功能,如请求进入Controller之前进行预处理(如权限验证),在请求完成之后处理(如日志记录)等
- 它专注于处理与控制器相关的请求,因此在业务逻辑处理中更加方便灵活
配置方式
Servlet过滤器(Filter)
Filter通过在web.xml
文件中配置,或者使用@WebFilter
注解来实现和配置。配置完成后,Filter会自动生效
现实过滤器:权限验证(token验证)
首先实现Filter接口--->重写doFilter()方法(此处没重写init()和destory())---->编写代码---->向后或者前返回
java
@WebFilter(urlPatterns = "/api/*")
public class TokenFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
System.out.println("token验证过滤器");
String token = request.getHeader("token");
boolean verify = JWTUtil.verify(token);
if (verify){
filterChain.doFilter(servletRequest, servletResponse);
}else {
Result result = new Result(401,"token认证失败",null);
servletResponse.getWriter().print(new ObjectMapper().writeValueAsString(result));
}
}
}
Spring拦截器(Interceptor)
Interceptor通过实现HandlerInterceptor
接口,并在Spring的配置文件中(如spring.xml
)进行配置,或者通过**@Configuration**类中的WebMvcConfigurer
进行注册
现实拦截器:权限验证(Token验证)
首先实现HandlerInterceptor接口---->重写preHandle()方法----->编写代码---->返回true/false
java
public class AdminTokenInterceptor implements HandlerInterceptor {
/*
拦截器处理的方法
当请求到达处理器前,进入到拦截器进行处理
返回true --- 离开拦截器,向后执行到达处理器
返回false --- 不在向后执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String adminToken = request.getHeader("adminToken");
//这里假设Token为1234567 这里没有调用Jwt生成Token
if (adminToken.equals("1234567")){
return true;
}else {
//向前端响应
Result result = new Result(401,"token验证失败",null);
response.getWriter().write(new ObjectMapper().writeValueAsString(result));
}
return false;
}
}
注册拦截器
java
@Configuration
public class WebConfig implements WebMvcConfigurer{
// 注册配置拦截器
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration inter = registry.addInterceptor(new AdminTokenInterceptor());
inter.addPathPatterns("/**"); //配置进入拦截器的地址
inter.excludePathPatterns("/loginCtl/login");//放行地址
//inter.addPathPatterns("/user/**"); //用户需要拦截过滤地址
}
}
生命周期
-
Servlet过滤器(Filter):
- Filter的生命周期由Servlet容器管理。Filter在容器启动时初始化,在容器关闭时销毁。
-
Spring拦截器(Interceptor):
- Interceptor的生命周期由Spring管理。Interceptor的初始化和销毁是与Spring的应用上下文(ApplicationContext)同步的。
执行顺序
-
Servlet过滤器(Filter):
- Filter链(Filter Chain)中的过滤器是按照配置顺序执行的。Filter可以在请求到达Servlet之前处理,也可以在Servlet处理之后响应返回之前处理。
-
Spring拦截器(Interceptor):
- Interceptor执行顺序由Spring的配置决定,支持多个拦截器按顺序执行。它提供了三个方法:preHandle、postHandle和afterCompletion,分别用于处理请求的不同阶段。(本文只重写postHandle)
总结
- 过滤器 适用于全局性的、跨所有资源的处理任务。
- 拦截器则更适用于特定于业务逻辑的控制器层面的请求处理
- 在Spring项目中拦截器使用场景较多