拦截器的应用:日志记录、权限检查、参数校验
1、添加拦截器
@Configuration
public class ResourcesConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
registry.addInterceptors(userInfoInterceptors).addPathPatterns("/user/list")
}
}
-
Spring加载并初始化
@Configuration
标记的类(同理,@Controller
、@Service
、@Component
标记的类也会初始化) -
Spring扫描实现
WebMvcConfigurer
的类,调用addInterceptors
方法,设置拦截器及其拦截规则-
addInterceptors
方法用于向Spring的拦截器注册表中添加拦截器。以便在请求处理前后执行一些操作添加
repeatSubmitInterceptor
拦截器,防止重复提交添加
userInfoInterceptors
拦截器,进行运管后台用户权限校验 -
addPathPatterns
方法定义了哪些请求路径应该被相应的拦截器拦截repeatSubmitInterceptor
拦截器匹配/**
全路径mssUserInfoInterceptors
拦截器仅匹配/user/list
路径
-
2、编写拦截器
@Component
public class MssUserInfoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
...
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
...
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
...
}
}
preHandle
:在请求处理之前进行调用(Controller方法调用之前)。postHandle
:在请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)。afterCompletion
:在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于资源清理工作)。
3、实现拦截器和切面的差异
关注点的范围不同:
- 拦截器: 主要用于拦截请求的处理流程,它可以在请求的预处理、后处理以及响应的渲染之前进行操作。
- 切面: 更广泛地用于拦截应用程序中的方法调用,不仅仅局限于请求的处理。切面能够横切整个应用程序,包括业务逻辑的不同部分。
作用对象不同:
- 拦截器: 作用于Spring MVC框架中的Controller层,可以用于处理HTTP请求。
- 切面: 作用于Spring框架中的IoC容器,可以拦截任何Spring Bean的方法调用。
实现方式不同:
- 拦截器: 在Spring MVC中通过实现
HandlerInterceptor
接口来创建拦截器,配置在WebMvcConfigurer
中。 - 切面: 通过使用注解或XML配置,在Java类中定义一个切面,通常使用
@Aspect
注解。
功能不同:
- 拦截器: 用于处理HTTP请求的一些预处理和后处理,如身份验证、日志记录等。
- 切面: 更强大,可以捕获方法调用前、后、异常抛出等时机,用于实现横切关注点,如日志、事务管理、性能监控等。
连接点的概念:
- 拦截器: 处理的连接点(Join Point)主要是在请求的处理流程中,如Controller的方法调用前后。
- 切面: 可以处理更广泛的连接点,包括方法的调用、对象的创建等。