Springboot 拦截器(Interceptor)

前言:

1、Spring MVC 框架:

  作用范围: 拦截器是 Spring MVC 框架提供的一部分,与 Spring 框架紧密集成,主要用于拦截处理 Spring MVC 请求。

  与 Spring 框架绑定: 拦截器直接与 Spring MVC 的 DispatcherServlet 集成,需要在 Spring 配置文件中进行配置。

2、初始化参数:

  Spring Bean: 拦截器是 Spring Bean,因此可以利用 Spring IoC 容器进行初始化。

3、处理流程:

  生命周期: 拦截器在请求进入控制器方法之前和控制器方法执行完成后执行。

  流程: 请求进入拦截器链 -> 拦截器链执行逻辑 -> 请求传递给控制器方法 -> 控制器方法处理请求 -> 返回拦截器链 -> 拦截器链执行逻辑 -> 响应返回给客户端。

 

代码实现:

0.创建springboot项目

1.开发拦截器--自定义类 实现 HandlerInterceptor接口

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 MyIntercepot implements HandlerInterceptor {
    /**
     * 请求到达控制器方法之前执行
     * <p>
     * 参数:
     * HttpServletRequest request:当前请求对象
     * HttpServletResponse response:当前响应对象
     * Object handler:被请求的处理器对象。
     * 返回值:
     * boolean 类型,表示是否继续执行后续的拦截器和控制器方法
     * 使用场景:
     * 在这个方法中,你可以进行一些前置处理,例如身份验证、日志记录等。如果返回 true,表示继续执行后续的拦截器和控制器方法;如果返回 false,表示中断后续执行。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("1111111111");
        return true;
    }


    /**
     * 控制器方法执行后、视图渲染之前执行
     * <p>
     * 参数:
     * HttpServletRequest request:当前请求对象。
     * HttpServletResponse response:当前响应对象。
     * Object handler:被请求的处理器对象。
     * ModelAndView modelAndView:控制器方法返回的 ModelAndView 对象。
     * 在这个方法中,你可以对 ModelAndView 进行进一步处理,或者添加一些公共的模型数据。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("3333333333");
    }


    /**
     * 在整个请求完成后(包括视图渲染完成)执行
     * <p>
     * 参数:
     * HttpServletRequest request:当前请求对象。
     * HttpServletResponse response:当前响应对象。
     * Object handler:被请求的处理器对象。
     * Exception ex:如果在请求处理过程中发生异常,将会传递到这里。
     * 无论请求处理过程中是否发生异常,这个方法都会被调用。在这个方法中,可以进行一些清理工作,例如资源释放等。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("44444444444");
    }
}

 

2. 配置拦截器

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Component
public class InterceptorConfig implements WebMvcConfigurer {

    //用来加入拦截器相关配置 参数1:InterceptorRegistry 拦截器注册对象
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/intercetor/**") //拦截所有控制器请求 
          .excludePathPatterns("/intercetor/test1");//排除指定的请求;
    //第二个是一个例子:代表拦截其他的请求
    registry.addInterceptor(new MyInterceptor2())
         .addPathPatterns("/**")//拦截所有控制器请求
         .excludePathPatterns("/user/findAll");//排除指定的请求;
   }
}

3. 测试控制层

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("intercetor")
public class IntercetorController {

    @RequestMapping("test")
    public String test(){
        System.out.println("222222222");
        return "index";
    }
  
  
  //进行拦截测试 @RequestMapping("test1") public String test1(){ System.out.println("222222222"); return "index"; } }

4.启动项目,访问接口进行测试 

 

  

 
posted @ 2022-07-13 22:38  向大海  阅读(250)  评论(0编辑  收藏  举报