SpringMVC 拦截器

一、拦截器简介

       拦截器是 AOP 的一种实现,基于SpringMVC专门拦截对动态资源的后台请求,即拦截对 controller 层的请求。拦截器不会拦截静态资源,Spring Boot 的默认静态目录为 resources/static,该目录下的静态页面、JS、CSS、图片等不会被拦截。
过滤器与拦截器的区别
(1)过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入 servlet 之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
(2)拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,因为拦截器是 spring 提供并管理的,spring 的功能可以被拦截器使用,在拦截器里注入一个 service,可以调用业务逻辑。而过滤器是 JavaEE 标准,只需依赖 servlet api ,不需要依赖 spring。
(3)过滤器的实现基于回调函数,而拦截器(代理模式)的实现基于反射。
(4)Filter 是依赖于 Servlet 容器,属于 Servlet 规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
(5)Filter 的执行由 Servlet 容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。
(6)Filter 的生命周期由 Servlet 容器管理,而拦截器则可以通过 IoC 容器来管理,因此可以通过注入等方式来获取其他 Bean 的实例,因此使用会更方便。
(7)过滤器可以修改 request,而拦截器不能;过滤器只能在请求的前后使用,而拦截器可以详细到每个方法。
原文链接:https://blog.csdn.net/it__learning/article/details/120200356
见他人优秀文章 https://blog.csdn.net/xinzhifu1/article/details/106356958
触发顺序:
在这里插入图片描述

二、使用拦截器

1、定义拦截器

定义拦截器,只需要实现 HandlerInterceptor 接口。HandlerInterceptor 接口是所有自定义拦截器或者 Spring Boot 提供的拦截器的鼻祖,该接口中有三个方法,分别为 preHandle()、postHandle() 和 afterCompletion() 。

  • SpringMVC中的拦截器有三个抽象方法:
    • preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法。
    • postHandle:控制器方法执行之后执行postHandle()。
    • afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()。
public class UserLoginInterceptor implements HandlerInterceptor {

    /***
     * 在请求处理之前进行调用(Controller方法调用之前)
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行了拦截器的preHandle方法");
      
        	// 获取session,注意 getSession 的参数设置为 false,避免 Session 为 null 再新建
            HttpSession session = request.getSession(false);
           	//获取header头解析
        	String appKey = request.getHeader("Authorization");
        	//获取header头解析
        	String sign = request.getHeader("SIGN");
        	//获取url
        	String url = request.getRequestURI();
    }

    /***
     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行了拦截器的postHandle方法");
    }

    /***
     * 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行了拦截器的afterCompletion方法");
    }
}

2、配置拦截器

实现 WebMvcConfigurer 接口,然后重写 addInterceptors 方法来注册拦截器。

在 Spring Boot 2.0 之前,我们都是直接继承 WebMvcConfigurerAdapter 类,然后重写 addInterceptors 方法来实现拦截器的配置。但是在 Spring Boot 2.0 之后,该方法已经被废弃了(当然,也可以继续用),取而代之的是 WebMvcConfigurationSupport 方法。但是 WebMvcConfigurationSupport 又会导致默认的静态资源被拦截,这就需要我们手动将静态资源放开。

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册TestInterceptor拦截器
        InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
        registration.addPathPatterns("/**"); 	//所有路径都被拦截
        registration.excludePathPatterns(    	//添加不拦截路径
                "/login",                    	//登录路径
                "/**/*.html",                	//html静态资源
                "/**/*.js",                  	//js静态资源
                "/**/*.css"                  	//css静态资源
        );
    }
}
  • 33
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值