SpringMVC-拦截器

1.过滤器、拦截器、AOP的区别

2.拦截器

  • SpringMVC拦截器用于拦截对控制器的访问
  • 当用户需要访问自定义控制器时,首先执行拦截器,只有拦截器放行后才允许访问目标控制
  • 创建interceptors包,并创建MyInterceptors类
  • MyInterceptors类继承HandlerInterceptor接口
  • 重写preHandle、postHandle、afterCompletion三个方法
  • 创建拦截器类

  • 当一个类实现了HandlerInterceptor接口后,则该类就成了一个拦截器类

  • 配置拦截器需要重写接口中的三个方法

(1)preHandle:该方法在控制器执行前执行

  • 该方法存在一个boolean类型的返回值

  • 返回true,表示放行、继续执行拦截器后的拦截器或控制器

  • 返回false,表示不放行、不继续执行拦截器后的拦截器或控制器

(2)postHandle:该方法在控制器执行后执行

(3)afterCompletion:该方法在上面两个方法执行结束后执行,用于清理所占用的资源

-配置拦截器

  • 在Web容器配置类中配置

  • 重写 public void addInterceptors(InterceptorRegistry registry) {}

-//注册新的拦截器

registry

.addInterceptor(new MyInterceptors())//注册拦截器

/**

* /**:表示拦截所有对控制器的访问

* /test/* :拦截所有对特使太目录下的控制器的访问

* /test/test2:只拦截某个拦截器

*/

.addPathPatterns("/test/test1")//设置拦截器的拦截路径,如果不配置拦截所有对控制器的方法

.order(2);//配置拦截器的执行顺序(优先级),数字越小优先级越高

registry

.addInterceptor(new MyInterceptors1())

.addPathPatterns("/**")

.order(1);

3.拦截器的实现

  • 创建拦截器类
    • 当一个类实现了HandlerInterceptor接口后,则该类就成了一个拦截器类
    • 配置拦截器需要重写接口中的三个方法
  • preHandle:该方法在控制器执行前执行
  • 该方法存在一个boolean类型的返回值
  • 返回true,表示放行、继续执行拦截器后的拦截器或控制器
  • 返回false,表示不放行、不继续执行拦截器后的拦截器或控制器
  • postHandle:该方法在控制器执行后执行
  • afterCompletion:该方法在上面两个方法执行结束后执行,用于清理所占用的资源
  • 配置拦截器
    • 在Web容器配置类中配置
    • 重写 public void addInterceptors(InterceptorRegistry registry) {}
  • -//注册新的拦截器
  • registry
  • .addInterceptor(new MyInterceptors())//注册拦截器
  • /**
  • * /**:表示拦截所有对控制器的访问
  • * /test/* :拦截所有对特使太目录下的控制器的访问
  • * /test/test2:只拦截某个拦截器
  • */
  • .addPathPatterns("/test/test1")//设置拦截器的拦截路径,如果不配置拦截所有对控制器的方法
  • .order(2);//配置拦截器的执行顺序(优先级),数字越小优先级越高
  • registry
  • .addInterceptor(new MyInterceptors1())
  • .addPathPatterns("/**")
  • .order(1);

4.源码

java 复制代码
package com.jiazhong.interceptors;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定义拦截器
 * 当一个类实现了HandlerInterceptor接口后,则该类就成了一个拦截器类
 * 拦截器类需要重写接口中的三个方法
 */
public class MyInterceptors1 implements HandlerInterceptor {
    /**
     * 该方法在执行控制器之前执行
     * @param request
     * @param response
     * @param handler
     * @return true 表示放行,继续放行其后的拦截器或控制器
     *          false表示不放行,不继续放行其后的拦截器或控制器
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器MyInterceptors1-------->preHandle被执行");
        return true;
    }

    /**
     * 在执行控制器之后执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器MyInterceptors1-------->postHandle被执行");
    }

    /**
     * 在最后执行,当preHandle和postHandle都执行之后执行
     * 该方法主要用于清理资源
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器MyInterceptors1-------->afterCompletion被执行");
    }
}
java 复制代码
 @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册新的拦截器
        registry
                .addInterceptor(new MyInterceptors())//注册拦截器
                /**
                 *  /**:表示拦截所有对控制器的访问
                 *  /test/* :拦截所有对特使太目录下的控制器的访问
                 *  /test/test2:只拦截某个拦截器
                 */
                .addPathPatterns("/test/test1")//设置拦截器的拦截路径,如果不配置拦截所有对控制器的方法
                .order(2);//配置拦截器的执行顺序(优先级),数字越小优先级越高
        registry
                .addInterceptor(new MyInterceptors1())
                .addPathPatterns("/**")
                .order(1);

    }
相关推荐
狗头大军之江苏分军1 分钟前
频繁跳槽和稳定工作有什么区别?真的比稳定工作的人差吗?
前端·后端
木子雨廷4 分钟前
Flutter 局部刷新小组件汇总
前端·flutter
m0_480502645 分钟前
Rust 入门 注释和文档之 cargo doc (二十三)
开发语言·后端·rust
mask哥6 分钟前
详解flink SQL基础(四)
java·大数据·数据库·sql·微服务·flink
黑客影儿7 分钟前
使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
开发语言·c++·人工智能·游戏·智能手机·ue5·游戏引擎
用户52709648744909 分钟前
组件库按需引入改造
前端
灰原喜欢柯南15 分钟前
Spring Boot 自动配置全流程深度解析
java·spring boot·后端
Code_Artist19 分钟前
[Java并发编程]4.阻塞队列
java·数据结构·后端
CryptoRzz20 分钟前
使用Java对接印度股票市场API开发指南
前端·后端
码间舞20 分钟前
道路千万条,安全第一条!要对付XSS等攻击你有什么手段?你知道什么是CSP吗?
前端·后端·安全