我是靠谱客的博主 孝顺蛋挞,最近开发中收集的这篇文章主要介绍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 个方法:

preHandler(HttpServletRequest request, HttpServletResponse response, Object handler)

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

postHandler(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 

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

afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 

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

实现HandlerInterceptor接口

@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());
    }
}

拦截器配置类

@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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部