`
sunbin
  • 浏览: 354207 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring Boot 拦截器HandlerInterceptor(转)

 
阅读更多

上一篇对过滤器的定义做了说明,也比较简单。过滤器属于Servlet范畴的API,与spring 没什么关系。 
    Web
开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器)。

HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。

实现 UserRoleAuthorizationInterceptor 的拦截器有: 
ConversionServiceExposingInterceptor 
CorsInterceptor 
LocaleChangeInterceptor 
PathExposingHandlerInterceptor 
ResourceUrlProviderExposingInterceptor 
ThemeChangeInterceptor 
UriTemplateVariablesHandlerInterceptor 
UserRoleAuthorizationInterceptor

其中 LocaleChangeInterceptor  ThemeChangeInterceptor 比较常用。

配置拦截器也很简单,Spring 为什么提供了基础类WebMvcConfigurerAdapter ,我们只需要重写addInterceptors 方法添加注册拦截器。

实现自定义拦截器只需要3步: 
1
、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。 
2
、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。 
2
、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。 
PS
:本文重点在如何在Spring-Boot中使用拦截器,关于拦截器的原理请大家查阅资料了解。

代码示例:

com.kfit.interceptor.MyInterceptor1.java

package com.kfit.interceptor;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

 

/**

 * 自定义拦截器1

 *

 * @author   Angel

 */

publicclassMyInterceptor1implementsHandlerInterceptor {

 

    @Override

    publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

            throws Exception {

        System.out.println(">>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");

 

        returntrue;// 只有返回true才会继续向下执行,返回false取消当前请求

    }

 

    @Override

    publicvoid postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

            ModelAndView modelAndView) throws Exception {

        System.out.println(">>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");

    }

 

    @Override

    publicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

            throws Exception {

        System.out.println(">>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");

    }

 

}

 

com.kfit.interceptor.MyInterceptor2.java

package com.kfit.interceptor;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

 

/**

 * 自定义拦截器2

 *

 * @author   Angel

 */

publicclassMyInterceptor2implementsHandlerInterceptor {

 

    @Override

    publicboolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

            throws Exception {

        System.out.println(">>>MyInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");

 

        returntrue;// 只有返回true才会继续向下执行,返回false取消当前请求

    }

 

    @Override

    publicvoid postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

            ModelAndView modelAndView) throws Exception {

        System.out.println(">>>MyInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");

    }

 

    @Override

    publicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

            throws Exception {

        System.out.println(">>>MyInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");

    }

 

}

 

Com.kfit.config.MyWebAppConfigurer.java

package com.kfit.config;

 

import com.kfit.interceptor.MyInterceptor1;

import com.kfit.interceptor.MyInterceptor2;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

 

@Configuration

publicclassMyWebAppConfigurer

        extendsWebMvcConfigurerAdapter {

 

    @Override

    publicvoid addInterceptors(InterceptorRegistry registry) {

        // 多个拦截器组成一个拦截器链

        // addPathPatterns 用于添加拦截规则

        // excludePathPatterns 用户排除拦截

        registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");

        registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");

        super.addInterceptors(registry);

    }

 

}

 

然后在浏览器输入地址: http://localhost:8080/index 后,控制台的输出为:

>>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)

>>>MyInterceptor2>>>>>>>在请求处理之前进行调用(Controller方法调用之前)

>>>MyInterceptor2>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

>>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

>>>MyInterceptor2>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

>>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

 

根据输出可以了解拦截器链的执行顺序(具体原理介绍,大家找度娘一问便知)

最后强调一点:只有经过DispatcherServlet 的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的,比如我们自定义的Servlet地址http://localhost:8080/myServlet1 是不会被拦截器拦截的。并且不管是属于哪个Servlet 只要复合过滤器的过滤规则,过滤器都会拦截。

最后说明下,我们上面用到的 WebMvcConfigurerAdapter 并非只是注册添加拦截器使用,其顾名思义是做Web配置用的,它还可以有很多其他作用,通过下面截图便可以大概了解,具体每个方法都是干什么用的,留给大家自己研究(其实都大同小异也很简单)。

分享到:
评论

相关推荐

    22. Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    在Spring Boot框架中,拦截器(HandlerInterceptor)是一种强大的机制,用于在请求处理前后执行自定义逻辑。在本文中,我们将深入探讨Spring Boot中的拦截器,了解其工作原理、如何实现以及实际应用。 首先,Spring...

    自己spring boot 拦截器

    创建自己的Spring Boot拦截器首先需要实现`HandlerInterceptor`接口或者继承`AbstractHandlerMethodInterceptor`抽象类。这个接口定义了三个方法: 1. `preHandle(HttpServletRequest request, HttpServletResponse...

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `postHandle()`, 和 `afterCompletion()` 来创建自定义的拦截器。 `preHandle()` 方法在目标处理方法调用之前执行...

    spring boot 登录拦截器

    在Spring Boot应用中,登录拦截器是一个至关重要的组件,它用于保护特定的Web资源,确保只有经过身份验证的用户才能访问。Spring Boot结合了Spring MVC框架,提供了方便的方式来实现这样的拦截器。本篇文章将深入...

    spring boot 拦截器拦截/Filter 过滤session案例

    在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口或继承`AbstractHandlerInterceptorAdapter`类来创建自定义拦截器。拦截器通常用于权限验证、日志记录、性能监控等场景。在这个案例中,我们可以创建一个...

    spring-boot添加 拦截器

    本篇文章将详细探讨如何在Spring Boot中添加和使用拦截器来实现登录拦截。 首先,我们需要了解Spring Boot中的拦截器是如何工作的。在Spring MVC框架中,拦截器是基于AOP(面向切面编程)的概念实现的。我们可以...

    SpringBoot拦截器原理解析及使用方法

    拦截器通常通过实现HandlerInterceptor接口来完成拦截逻辑,这个接口提供了三个主要方法:preHandle、postHandle和afterCompletion。 - preHandle方法在请求处理之前进行调用,也就是Controller方法被调用之前。...

    从零开始学Spring Boot

    1.25 Spring Boot 拦截器HandlerInterceptor 1.26 Spring Boot启动加载数据CommandLineRunner 1.27 Spring Boot环境变量读取和属性对象的绑定 1.28 Spring Boot使用自定义的properties 1.29 改变自动扫描的包 1.30 ...

    springboot spring aop 拦截器注解方式实现脱敏

    这将设置Spring Web相关类的日志级别为DEBUG,以便我们能看到拦截器的执行过程。 启动类通常会包含`@SpringBootApplication`注解,该注解包含了`@EnableAutoConfiguration`,`@ComponentScan`和`@...

    Spring Boot拦截器实现步骤及测试实例

    Spring Boot拦截器需要实现org.springframework.web.servlet.HandlerInterceptor接口,该接口提供了三个方法: * preHandle:在请求处理之前被调用,返回true表示继续处理请求,返回false表示中断请求处理。 * ...

    Spring拦截器,高级参数绑定

    首先,我们创建一个Spring拦截器需要实现HandlerInterceptor接口或继承HandlerInterceptorAdapter抽象类。以下是一个简单的拦截器示例: ```java import org.springframework.web.servlet.HandlerInterceptor; ...

    基于springboot的过滤器。拦截器,Aspect,定时器

    2. **Spring Boot拦截器(Interceptor)** 拦截器是Spring MVC提供的功能,可以对Controller处理之前和之后进行拦截,通常用于权限校验、日志记录、性能统计等。创建自定义拦截器需要实现`HandlerInterceptor`接口...

    dynamic-datasource-spring-boot-starter_多数据源_

    `dynamic-datasource-spring-boot-starter`项目正致力于解决这个问题,它是一个基于Spring Boot的启动器,用于实现动态数据源切换,提供灵活的数据源管理功能。 **动态数据源**指的是在一个应用中可以动态地选择...

    spring boot mybatis 国际化 拦截器

    为了支持拦截器,我们需要定义一个实现`HandlerInterceptor`接口的类,例如`LocaleChangeInterceptor`,并在Spring MVC配置中注册该拦截器: ```java @Configuration @EnableWebMvc public class WebConfig ...

    SpringBoot拦截器实现对404和500等错误的拦截

    首先,创建自定义拦截器类并实现`HandlerInterceptor`接口是实现拦截器功能的第一步。如示例代码所示,我们需要创建一个名为`ErrorInterceptor`的类,并在其中实现`preHandle`和`postHandle`方法。这两个方法都是在...

    Spring Boot 学习笔记完整教程.pdf

    - **拦截器 HandlerInterceptor**:Spring MVC 提供了 HandlerInterceptor 接口,用于拦截请求并进行预处理或后处理。 - **系统启动任务 CommandLineRunner**:可以实现 CommandLineRunner 接口,在 Spring Boot ...

    Spring Boot集成Mybatis附加自动生成工具,异常信息处理等工具类,拦截器,最全框架

    总的来说,这个项目提供了一个完整的Spring Boot和Mybatis集成方案,涵盖了开发过程中的多个重要方面,如自动化工具、异常处理和拦截器,这对于构建高效且可维护的Web应用来说是非常有益的。同时,通过`...

    spring-boot 自定义xml配置web请求拦截器

    标题中的"spring-boot 自定义xml配置web请求拦截器"指的是在Spring Boot项目中,通过XML配置方式实现对Web请求的拦截处理。这涉及到Spring Boot的Web层架构、AOP(面向切面编程)以及自定义拦截器的概念。Spring ...

    spring boot的拦截器简单使用示例代码

    Spring Boot拦截器的简单使用示例代码 Spring Boot框架提供了拦截器机制,允许开发者在请求处理过程中执行自定义逻辑。拦截器可以用来实现身份验证、权限控制、日志记录、性能监控等功能。在Spring Boot中,拦截器...

Global site tag (gtag.js) - Google Analytics