玩转 SpringBoot 2 快速整合拦截器

概述

首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor。使用SpringMVC 拦截器需要做如下操作:

  1. 创建拦截器类需要实现 HandlerInterceptor
  2. 在 xml 配置文件中配置该拦截器,具体配置代码如下:
<mvc:interceptors>
    <mvc:interceptor>
    <!-- /test/** 这个是拦截路径以/test开头的所有的URL-->
    <mvc:mapping path="/**"/><!—这个是拦截说有的路径-->
    <!-- 配置拦截器类路径-->
    <bean class="cn.ljk.springmvc.controller.MyInterceptor"></bean>
    <!-- 配置不拦截器URL路径-->
    <mvc:exclude-mapping path="/fore/**"/>
    </mvc:interceptor>
</mvc:interceptors>

因为在SpringBoot 中没有 xml 文件,所以SpringBoot 为我们提供 Java Config 的方式来配置拦截器。配置方式有2种:

  1. 继承 WebMvcConfigurerAdapter (官方已经不建议使用)
  2. 实现 WebMvcConfigurer

接下来开始 SpringBoot 整合拦截器操作详细介绍!

整合拦截器实战操作

第一步:声明拦截器类

通过实现 HandlerInterceptor 来完成。具体代码如下:

public class LoginInterceptor implements HandlerInterceptor{}

第二步:实现 HandlerInterceptor 3 个拦截方法

  • preHandle:Controller逻辑执行之前进行拦截
  • postHandle:Controller逻辑执行完毕但是视图解析器还为进行解析之前进行拦截
  • afterCompletion:Controller逻辑和视图解析器执行完毕进行拦截

实际开发中 preHandle使用频率比较高,postHandle 和 afterCompletion操作相对比较少。

在下面的代码中 preHandle 方法中定义拦截所有访问项目 URL并进行日志信息记录。postHandle 中在视图解析前进行拦截,通过 Model 在次添加数据Request域中。

afterCompletion 暂时没有想到使用场景,如果有使用过的场景可以在下面评论区中进行评论。

拦截器详细代码如下:

public class LoginInterceptor implements HandlerInterceptor{

    private Logger log = LoggerFactory.getLogger(LoginInterceptor.class);

    //ControllerController逻辑执行之前
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle....");
        String uri = request.getRequestURI();
        log.info("uri:"+ uri);
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            log.info("拦截 Controller:"+ handlerMethod.getBean().getClass().getName());
            log.info("拦截方法:"+handlerMethod.getMethod().getName());
        }

        return true;
    }

    //Controller逻辑执行完毕但是视图解析器还为进行解析之前
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        log.info("postHandle....");
        Map<String,Object>map=modelAndView.getModel();
        map.put("msg","postHandle add msg");
    }

    //Controller逻辑和视图解析器执行完毕
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        log.info("afterCompletion....");
    }
}

第三步:Java Config 的方式来配置拦截器

继承 WebMvcConfigurerAdapter 方式

通过继承 WebMvcConfigurerAdapter并重写 addInterceptors方法,通过其参数 InterceptorRegistry将拦截器注入到 Spring的上下文中。

另外拦截路径和不拦截的路径通过InterceptorRegistry 的 addPathPatterns和 excludePathPatterns方法进行设置。

这种方式官方已经不建议使用,因为官方已将 WebMvcConfigurerAdapter 标记为@Deprecated 了。

@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {

继承 WebMvcConfigurerAdapter 方式具体代码如下:

@Configuration
    public class InterceptorConfigByExtendsWebMvcConfigurerAdapter extends  WebMvcConfigurerAdapter{

    @Bean
        public LoginInterceptor loginInterceptor(){
                return new LoginInterceptor();
        }

        public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
        }
}

实现 WebMvcConfigurer 方式

通过实现 WebMvcConfigurer 接口并实现 addInterceptors方法,其他操作和继承 WebMvcConfigurerAdapter方式一样。具体代码如下:

```java
@Configuration
public class InterceptorConfigByImplWebMvcConfigurer implements WebMvcConfigurer{

    @Bean
    public LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }
     @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/*.html");
    }
}
```

测试

编写普通Controller,具体代码如下:

@Controller
public class IndexController {

    @GetMapping("/index")
    public String index(ModelAndView modelAndView){

        return "index";
    }
}

在 src/main/resource 下的 templates目录下创建 IndexController访问页面 index.ftl, 代码如下:

<h1>${msg}</h1>

由于我这里使用的是 Freemarker当页面使用,说以需要引入 Freemarker starter依赖,具体点如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

通过游览器访问 localhost:8080/sbe/index,具体访问效果如下:

如上图所示在视图解析前通过 Model在次添加数据到 Request域中的msg 成功显示出来了!

日志输出信息如下:拦截地址和拦截Controller 和具体方法进行日志输出

2019-09-24 15:53:04.144  INFO 7732 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/sbe]    : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-09-24 15:53:04.145  INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-09-24 15:53:04.153  INFO 7732 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : preHandle....
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : uri:/sbe/index
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : 拦截 Controller:cn.lijunkui.controller.IndexController
2019-09-24 15:53:04.155  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : 拦截方法:index
2019-09-24 15:53:04.156  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : postHandle....
2019-09-24 15:53:04.161  INFO 7732 --- [nio-8080-exec-1] c.lijunkui.interceptor.LoginInterceptor  : afterCompletion....

小结

SpringBoot 2 整合拦截器和整合 Filter的操作很像,都是通过一个注册类将其注入到Spring的上下文中,只不过Filter使用的是 FilterRegistrationBean 而 拦截器使用的是 InterceptorRegistry。

个人觉得比使用 xml 配置的方式更为简单了,如果你还没有在 SpringBoot 项目中使用过拦截器,赶快来操作一下吧!

代码示例

具体代码示例请在我的GitHub 仓库 springbootexamples 中模块名为 spring-boot-2.x-interceptor 项目中进行查看

GitHub:https://github.com/zhuoqianmingyue/springbootexamples

原文地址:https://www.cnblogs.com/jerry126/p/11621350.html

时间: 2024-10-01 13:02:59

玩转 SpringBoot 2 快速整合拦截器的相关文章

玩转 SpringBoot 2 之整合 JWT 下篇

前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 App 用户登录 Session 问题的实战操作,带你更深入理解 JWT.通过本文你还可以了解到如下内容: SpringBoot 使用拦截器的实际应用 SpringBoot 统一异常处理 SpringBoot 快速搭建 RESTful Api 关于生成JWT 操作请参考 <玩转 SpringBoot 2

玩转 SpringBoot 2 快速搭建 | RESTful Api 篇

概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP 协议的Web 接口,需要注意的是它和 HTTP 协议并非绑定关系.我的个人理解就是:通过HTTP协议不同请求方法(GET.POST.PUT.Patch,DELETE)来判断如何操作统一命名的资源,并且通过不同的响应码来知道执行的状态. 关于 RESTful API 具体详细介绍,我推荐阅读下面 3

Springboot项目怎么使用拦截器

? 在这里小小推荐下我的个人博客 csdn:雷园的csdn博客 个人博客:雷园的个人博客 简书:雷园的简书 Springboot项目怎么使用拦截器 1. 创建一个拦截器并实现HandlerInterceptor接口 package com.leiyuan.bs.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAnd

玩转 SpringBoot 2 之整合 JWT 上篇

前言 该文主要带你了解什么是 JWT,以及JWT 定义和先关概念的介绍,并通过简单Demo 带你了解如何使用 SpringBoot 2 整合?JWT. 介绍前在这里我们来探讨一下如何学习一门新的技术,我个人总结为 RSA. R:read 去读官方文档 . S:search 谷歌或百度先关技术文章或 github 去搜索先关信息. A:ask 可以向技术大牛请教或和自己的同事同学进行探讨. 关于?RSA 仅仅代码个人的学习观点,只是给读者一个不成熟的小建议哈 JWT 介绍 官网介绍如下: What

SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆

在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringBoot,或者有意向学习Springboot的朋友,这篇文章可以简单的来帮助你,处理一些不必要的麻烦. 开发环境: IDea JDK1.8 SpringBoot2+ Maven3.5 1.配置Maven 首先我们打开IdeA我们从新建一个项目开始.SpringBoot是基于Maven来管理Jar包的.

springboot 2.0+ 自定义拦截器 静态资源问题

之前项目的springboot自定义拦截器使用的是继承WebMvcConfigurerAdapter重写常用方法的方式来实现的.静态文件不需要进行放行,springboot会自动帮你放行. springboot2.0之后如果想要自定义的话就不可以了,需要手动放行静态资源.此处我是实现了WebMvcConfigurer来自定义拦截器(根据需求也可以继承WebMvcConfigurationSupport,此处不再赘述).下面是实现代码 @Configuration public class MyM

springboot成神之——拦截器

本文介绍spring boot拦截器 创建拦截器类LogInterceptor.java 创建拦截器类OldLoginInterceptor.java 拦截器配置类WebMvcConfig.java 路由InterceptorController.java 本文介绍spring boot拦截器 创建拦截器类LogInterceptor.java package com.springlearn.learn.interceptor; import javax.servlet.http.HttpSer

SpringBoot(十一)过滤器和拦截器

在做web开发的时候,过滤器(Filter)和拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇. 过滤器依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初

Spring Boot整合拦截器

过滤器和监听器都属于Servlet 的api,还可以使用 Spring 提供的拦截器(HandlerInterceptor)进行改更精细的控制. 原文地址:https://www.cnblogs.com/natian-ws/p/10823072.html