Spring拦截器

一、拦截器(1)

  一)、HandlerInterceptor(拦截器)

   ☆☆☆定义实现类

    方式一:类实现Spring的HandlerInterceptor接口

    方式二:类继承实现了HandlerInterceptor接口的类,如实现了HandlerInterceptor接口的抽象类 →    HandlerInterceptorAdapter

   ☆☆☆方式介绍

    ①、boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws  Exception; //在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等;

    ②、void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception; //在业务处理器处理请求完成之后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但没有渲染),可以对ModelAndView做更改

    ③、void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception; //在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面)

   ☆☆☆进阶使用(这里引用别的博主的内容)

    //https://blog.csdn.net/zhibo_lv/article/details/81738940

    //https://blog.csdn.net/zhibo_lv/article/details/81875705 //解决在拦截器中通过request.getInputStream();获取到body中的信息后,在controller中使用了@RequestBody注解报错 I/O error while reading input message; nested exception is java.io.IOException: Stream closed

    //https://blog.csdn.net/zhibo_lv/article/details/81905300 //防止重复提交

  

  ★★★★★子类(非完全相同与Java中的子类的定义,请注意区分)

   1、接口 AsyncHandlerInterceptor 直接继承HandlerInterceptor

    /*

    * 相对于HandlerInterceptor,新增方法

    * 该方法会在Controller方法异步执行时先支持preHandle(),然后此方法开始执行,而HandlerInterceptor的postHandle()需要等Controller异步执行完才执行

    */

    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object   handler) throws Exception { }

 

    2、抽象类HandlerInterceptorAdapter 拦截器适配器,需要继承HandlerInterceptor,由于AsyncHandlerInterceptor 直接继承HandlerInterceptor,所以HandlerInterceptorAdapter 可以直接实现AsyncHandlerInterceptor

    public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

     /**

     * 默认是true

     */

     @Override

     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; }

     /**

     * This implementation is empty.

     */

     @Override

     public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { }

     /**

     * This implementation is empty.

     */

     @Override

     public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }

     /**

     * 不是HandlerInterceptor的接口实现,是AsyncHandlerInterceptor的,AsyncHandlerInterceptor实现了HandlerInterceptor

     */

     @Override

     public void afterConcurrentHandlingStarted( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { }

     }

 

   二)、InterceptorRegistry (拦截器注册类登记类)

    //org.springframework.web.servlet.config.annotation.InterceptorRegistry

    方法

     1、addInterceptor方法

      /**

      * 添加提供的{@link HandlerInterceptor}。

      * 拦截器用于添加@return {@link InterceptorRegistration},允许您进一步配置已注册的拦截器,

      * 例如添加它应该应用到的URL模式。

      */

      public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {

        InterceptorRegistration registration = new InterceptorRegistration(interceptor);

        this.registrations.add(registration);

        return registration;

      }

 

     2、addWebRequestInterceptor方法

      /**

      * 添加提供的{@link WebRequestInterceptor}。

      * 拦截器用于添加@return {@link InterceptorRegistration},允许您进一步配置已注册的拦截器,

      * 例如添加它应该应用到的URL模式。

      */

      public InterceptorRegistration addWebRequestInterceptor(WebRequestInterceptor interceptor) {

        WebRequestHandlerInterceptorAdapter adapted = new WebRequestHandlerInterceptorAdapter(interceptor);

        InterceptorRegistration registration = new InterceptorRegistration(adapted);

        this.registrations.add(registration);

        return registration;

       }

 

     3、getInterceptors方法

       /**

       * 返回所有已注册的拦截器。

       */

       protected List<Object> getInterceptors() {

         return this.registrations.stream()

.         sorted(INTERCEPTOR_ORDER_COMPARATOR)

.         map(InterceptorRegistration::getInterceptor)

         .collect(Collectors.toList());

       }

 

     4、

       /*

       * 拦截器注册类集合

       */

       private final List<InterceptorRegistration> registrations = new ArrayList<>();

 

     5、

       /*

       * 用于拦截器顺序排序规则

       * 自定义规则

       */

       private static final Comparator<Object> INTERCEPTOR_ORDER_COMPARATOR =

         OrderComparator.INSTANCE.withSourceProvider(object -> {

           if (object instanceof InterceptorRegistration) {

           return (Ordered) ((InterceptorRegistration) object)::getOrder;

         }

        return null;

       });

//以上为根据公司项目加上各个博主博客内容的综合。暂时先给到个开头,还有续集。如有相同、有误,还请指出。

//请勿喷,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架中,拦截器是一种可以拦截请求并在处理请求之前或之后执行自定义逻辑的组件。它们可以用于实现身份验证、授权、日志记录等功能。下面是使用拦截器的步骤: 1. 创建一个类并实现`HandlerInterceptor`接口。 2. 在类中实现`preHandle`、`postHandle`和`afterCompletion`方法,分别在请求处理之前、请求处理之后和视图渲染完成后执行特定的逻辑。 3. 在配置文件中注册拦截器,并指定拦截的URL模式或特定路径。 以下是一个简单的例子: ```java public class CustomInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前执行的逻辑 return true; // 返回true继续处理请求,返回false终止请求处理 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理之后但视图渲染之前执行的逻辑 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在视图渲染完成后执行的逻辑 } } ``` 在配置文件中注册拦截器: ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有URL --> <bean class="com.example.CustomInterceptor"/> </mvc:interceptor> </mvc:interceptors> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值