您当前的位置: 首页 >  spring

庄小焱

暂无认证

  • 5浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SpringBoot——拦截器原理与实战

庄小焱 发布时间:2021-03-31 13:45:14 ,浏览量:5

摘要

主要是讲解Spring Boot 拦截器的原理和使用。拦截器的主要是基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在Service或者一个方法前调用一个方法,或者在方法后调用一个方法,甚至在抛出异常的时候做业务逻辑的操作

拦截器介绍

拦截器的作用类似于Servlet 中的Filter,都可以用于对处理器进行预处理和后处理。在Spring MVC 与Spring Boot 中使用拦截器一般是实现HandlerInterceptor 接口。

HandlerInterceptor 接口提供了三个方法。下面分别对这三个方法作具体介绍。

public interface HandlerInterceptor {

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;

    void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;

    void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;

}
  • preHandle():这个方法可以实现处理器的预处理,也就是它会在handler 方法执行之前就开始执行。当返回值是true 时表示继续执行,返回false 时则不会执行后续的拦截器或处理器。作用:身份验证,身份授权等。
  • postHandle():这个方法是后处理回调方法,也就是在控制器完成后(试图渲染之前)执行。作用:将公用的模型数据传到视图,也可以在这里统一指定视图(菜单导航等)。
  • afterCompletion():这个方法是请求处理完毕后的回调方法,即在视图渲染完毕时调用。作用:进行统一的异常处理,日志处理等。  
在Spring Boot 中使用拦截器
  1. 写一个拦截器实现HandlerInterceptor 接口。
  2. 再写一个类继承WebMvcConfigurerAdapter 接口,重写其中的addInterceptors() 方法。调用registry.addInterceptor() 方法注册该拦截器。

拦截器MyHandlerInterceptor 类:

public class MyHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) 
            throws Exception {
        System.out.println("== preHandle ==");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, 
                           Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("== postHandle ==");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, 
                                Object o, Exception e) throws Exception {
        System.out.println("== afterCompletion ==");
    }
}

注册拦截器WebConfiguration

@SpringBootConfiguration
public class WebConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**");
    }
}

控制器TestController

@RestController
public class TestController {

    @GetMapping("/helllo")
    @ResponseBody
    public String test(){
        System.out.println("== Controller ==");
        return "Hello World!";
    }
}

参考:

Spring Boot 拦截器_留兰香丶的博客-CSDN博客

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.2595s