我是靠谱客的博主 孝顺蛋挞,这篇文章主要介绍interceptor拦截器interceptor,现在分享给大家,希望可以做个参考。

interceptor

拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程。在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors

Spring Interceptor是一个非常类似于Servlet Filter 的概念

拦截流程

1、当访问需要有一定权限的资源时,由拦截器重定向到指定页面

2、拦截器还应该配置允许游客访问的资源,比如访问的是登录页面,拦截器不应该拦截

3、用户登录成功后,往 cookie/session 添加登录成功的标识

4、下次请求时,拦截器通过判断 cookie/session 中是否有该标识来决定继续流程还是到登录页面

Interceptor 作用

拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等; 权限检查:如登录检测,进入处理器检测是否登录; 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。

自定义 Interceptor

如果自定义 Interceptor 须实现 HandlerInterceptor接口或继承 HandlerInterceptorAdapter类,并且需要重写下面下面 3 个方法:

复制代码
1
preHandler(HttpServletRequest request, HttpServletResponse response, Object handler)

此方法在请求处理之前被调用。该方法在 Interceptor 类中最先执行,用来进行一些前置初始化操作或是对当前请求做预处理,也可以进行一些判断来决定请求是否要继续进行下去。该方法的返回至是 Boolean 类型,当它返回 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当它返回为 true 时会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候就会调用当前请求的 Controller 方法。

复制代码
1
postHandler(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

此方法在当前请求处理完成之后,也就是 Controller 方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。

复制代码
1
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)

此方法需要在当前对应的 Interceptor 类的 postHandler 方法返回值为 true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行。此方法主要用来进行资源清理。

实现HandlerInterceptor接口

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Component public class AlphaInterceptor implements HandlerInterceptor { ​    private static final Logger logger = LoggerFactory.getLogger(AlphaInterceptor.class); ​ //   在Controller之前执行    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        logger.debug("preHandle:"+handler.toString());        return  true;   } // 在Controller之后执行    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);        logger.debug("postHandle:"+handler.toString());   } // 在TemplateEngine之后执行    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);        logger.debug("afterCompletion"+handler.toString());   } }

拦截器配置类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
@Configuration public class WebMvcConfig implements WebMvcConfigurer {    @Autowired    private AlphaInterceptor alphaInterceptor; ​    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(alphaInterceptor)               .excludePathPatterns("/**/*.css","/**/*.js","/**/*.png","/**/*.jpg","/**/*.jpeg")               .addPathPatterns("/register","/login");   } }

最后

以上就是孝顺蛋挞最近收集整理的关于interceptor拦截器interceptor的全部内容,更多相关interceptor拦截器interceptor内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部