• Spring之拦截器


    一、Spring拦截器简介

    Spring拦截器是一种基于AOP的技术,本质也是使用一种代理技术,它主要作用于接口请求中的控制器,也就是Controller。因此它可以用于对接口进行权限验证控制。

    下面我们看一个简单的拦截器例子

    创建一个DemoInterceptor类实现HandlerInterceptor接口,重写preHandle(),postHandle(),afterCompletion() 三个方法,如下代码,我们就创建了一个Spring的拦截器。

    public class DemoInterceptor implements HandlerInterceptor {
    
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    		System.out.println("preHandle......");
    		return true;
    	}
    
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    		System.out.println("postHandle......");
    	}
    
    	@Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    		System.out.println("afterCompletion......");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    创建拦截器之后,我们还需要将其注册到Spring程序中,以便启用它。

    注册拦截器

    创建一个Spring配置类实现WebMvcConfigurer接口,并重写addInterceptors()方法,用于将拦截器添加到程序中。

    @Configuration
    public class MvcConfig implements WebMvcConfigurer {
    
       @Override
       public void addInterceptors(InterceptorRegistry registry) {
          registry.addInterceptor(new DemoInterceptor());
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建一个接口用于查看拦截器的执行效果

    @RestController
    @RequestMapping("/interceptor")
    public class DemoController {
    
    
       @GetMapping("/demo")
       public String demoAction() {
          System.out.println("interceptor-demo......");
          return "success";
       }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试接口

    如控制台打印,preHandle()方法在Controller方法执行之前执行,postHandle()与afterCompletion()方法都在打印语句之后,那它的执行顺序是什么样的呢?

    二、Spring拦截器执行源码解析

    主要执行代码在DispatcherServlet类中,其中有个**doDispatch()**的方法他就是做handler执行的,也就是执行接口处理逻辑,其中一系列的拦截器执行顺序写在此处。

    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
       HttpServletRequest processedRequest = request;
       HandlerExecutionChain mappedHandler = null;
       boolean multipartRequestParsed = false;
    
       WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    
       try {
          ModelAndView mv = null;
          Exception dispatchException = null;
    
          try {
             processedRequest = checkMultipart(request);
             multipartRequestParsed = (processedRequest != request);
    
        
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    素问·风论原文
    上海物理、化学高考命题趋势及2024年上海物理、化学高考备考建议
    窗口函数OVER(PARTITION BY)详细用法——语法+函数+开窗范围ROWS和RANGE
    攻防世界 [简单] 凯撒大帝在培根里藏了什么
    openpnp - 设备电源抗干扰部件的选择
    数据结构学习:Trie树
    IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven核心概念
    猿创征文|Vue结合Vant-ui实现数据列表上拉加载更多,下拉刷新功能
    防火墙综合实验三
    PMP备考全攻略,看这一份就够了!
  • 原文地址:https://blog.csdn.net/m0_54850467/article/details/126812171