Spring一步到位精通 *

作者:不死鸟.亚历山大.狼崽子 时间:2022-01-03 18:31:50 

1 *

* 是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言, * 要的控制更加的细节, * 可以在三个地方进行执行:

  • 可以在请求达到Controller控制器之前,通过 * 执行一段代码

  • 也可以在控制器执行之后,通过 * 执行一段代码,此时只是Controller执行完毕视图还没有开始渲染

  • 最后在整个请求结束的时候还可以通过 * 执行一段代码

使用 * 的方法

  • 创建支持它的@Component类,它应该实现HandlerInterceptor接口

  • 实现WebMVCConfigure配置器,注册到spring容器中,添加拦截路径和放行路径

* 和过滤器的区别:

* (Interceptor)类似于Servlet中的过滤器( Filter),它主要用于拦截用户请求并做相应的处理。

  • 过滤器只能在容器初始化时被调用异常,在action的生命周期中,而 * 可以多次被调用。

  • 过滤器可以对几乎所有的请求起作用, * 只能对action请求起作用。

  • 过滤器不能访问action上下文、堆栈里的对象,而 * 可以访问。

  • 过滤器是基于函数回调,而 * 不依赖与servlet容器。

  • 过滤器不能获取IOC容器中的各个bean,而 * 可以,这点很重要,在 * 里注入一个service,可以调用业务逻辑

* 是在DispatcherServlet这个servlet中执行的,因此所有的请求最先进入Filter,最后离开Filter。其顺序如下。

Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter

2 实现流程

2.1 引入依赖

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

2.2 自定义 *

package com.example.demo.Interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class EasyLogControllerInterceptor implements HandlerInterceptor {
   /**
    * 在controller调用之前执行
    */
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
           throws Exception {
       System.out.println(request.getRequestURI()+"开始执行");
       return true;
   }
   /**
    * 在controller调用中执行
    */
   public void postHandle(
           HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
           throws Exception {
       System.out.println(request.getRequestURI()+"执行中");
   }
   /**
    * 在controller调用后执行
    */
   public void afterCompletion(
           HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
           throws Exception {
       System.out.println(request.getRequestURI()+"执行结束");
    }
}

2.3 注入适配器

package com.example.demo.Interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
   @Autowired
   private EasyLogControllerInterceptor easyLogControllerInterceptor;
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       //addPathPatterns用于添加拦截路径
       //excludePathPatterns用于添加不拦截的路径
       registry.addInterceptor(easyLogControllerInterceptor).addPathPatterns("/hello");
   }
   //此方法用于配置静态资源路径
   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/**").addResourceLocations("classpath:/my/");
   }
}

执行结果如下:

Spring一步到位精通 *

访问hello接口时,会进入 * ,其他的接口不会进入。

3 控制器验证

多个 * 顺序

  • 多个 * 的执行顺序和注册的顺序有关,先注册的先执行

  • 可以通过Order方法来设置执行顺序,值越小越先执行

来源:https://blog.csdn.net/u013938578/article/details/128644332

标签:Spring, ,
0
投稿

猜你喜欢

  • java 解决异常 2 字节的 UTF-8 序列的字节2 无效的问题

    2021-06-01 10:29:00
  • Java字符串拼接新方法 StringJoiner用法详解

    2022-06-16 13:02:13
  • 轻松实现可扩展自定义的Android滚轮时间选择控件

    2022-06-25 04:21:24
  • C#异步编程由浅入深(一)

    2023-12-16 07:32:29
  • C#处理Access中事务的方法

    2021-07-01 13:43:39
  • SpringBoot项目Jar包如何瘦身部署的实现

    2021-09-21 05:37:51
  • Eclipse最新版使用过程中遇到的问题总结

    2023-12-03 04:14:14
  • Android下拉刷新与轮播图滑动冲突解决方案

    2021-08-12 12:30:40
  • Java面试题冲刺第二十三天--分布式

    2023-09-24 07:30:43
  • Spring EL表示式的运用@Value说明

    2023-03-05 02:33:19
  • Android 两个Fragment之间传递数据实例详解

    2022-06-23 19:30:09
  • AQS同步组件Semaphore信号量案例剖析

    2023-11-27 14:27:04
  • ThreadLocal数据存储结构原理解析

    2023-04-27 19:54:55
  • android自定义View圆圈拖动

    2023-09-14 01:02:55
  • WPF+SkiaSharp实现自绘投篮小游戏

    2023-09-06 22:59:51
  • 基于Java代码操作Redis过程详解

    2022-03-28 06:53:58
  • Android通知栏前台服务的实现

    2022-10-13 22:57:46
  • C++选择排序算法实例

    2021-10-27 21:43:33
  • 解决Java中的java.io.IOException: Broken pipe问题

    2022-01-24 00:40:34
  • Android SharedPreferences的使用分析

    2023-11-09 18:47:08
  • asp之家 软件编程 m.aspxhome.com