SpringBoot拦截器(Interceptor)的使用

目录

 

1.拦截器(Interceptor)的定义

1.1 拦截器(Interceptor)执行顺序

1.2 拦截器(Interceptor)和过滤器(Filter)的执行顺序

 1.3 方法介绍

1)预处理preHandle()方法

2)后处理postHandle()方法

3)返回处理afterCompletion()方法

2 Spring Boot使用拦截器

2.1 自定义拦截器

2.2 注册拦截器

3 对指定方法进行拦截

3.1 编写一个注解

3.2 修改拦截器

3.3 编写controller测试


1.拦截器(Interceptor)的定义

拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。

1.1 拦截器(Interceptor)执行顺序

请求到达 DispatcherServlet
DispatcherServlet 发送至 Interceptor ,执行 preHandle
请求达到 Controller
请求结束后,postHandle 执行

1.2 拦截器(Interceptor)和过滤器(Filter)的执行顺序

过滤前->拦截前->Action处理->拦截后->过滤后
在这里插入图片描述

 1.3 方法介绍

1)预处理preHandle()方法

用户发送请求时,先执行preHandle()方法。会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则执行用户请求的url方法。

2)后处理postHandle()方法

调用了Service并返回ModelAndView,但未进行页面渲染,可以在这里继续修改ModelAndView或者返回值

3)返回处理afterCompletion()方法

已经渲染了页面,在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

2 Spring Boot使用拦截器

2.1 自定义拦截器

需要继承HandlerInterceptorAdapter类
注意,在更高版本中HandlerInterceptorAdapter已经弃用,推荐实现HandlerInterceptor接口

package com.yutao.filter;

import com.yutao.dao.system.UserDao;
import com.yutao.pojo.system.users.dos.UserDO;
import org.springframework.beans.factory.annotation.Autowired;
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;

/**
 * 自己定义一个拦截器,这里实现了 HandlerInterceptor 接口
 *
 * @author yt
 * @create 2022/10/17 10:52
 */
@Component
public class BaseInterceptor implements HandlerInterceptor {

    //可以通过配置类注入想要的类
    private UserDao userDao;

    @Autowired
    public BaseInterceptor(UserDao userDao){
        this.userDao = userDao;
    }

    //方法执行前执行的接口
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器执行=========");
        //可以在方法执行前执行其他的类
        UserDO userDO = userDao.selectByName("1");
        System.out.println("userDO = " + userDO);

        System.out.println("拦截器结束=========");
        return true;
    }
    //方法执行后执行的方法
    @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 {

    }
}

2.2 注册拦截器

 需要继承WebMvcConfigurerAdapter类
注意,在更高版本中WebMvcConfigurerAdapter已经弃用,推荐实现WebMvcConfigurer接口
需要重写addInterceptors方法,这里是对根目录"/"进行拦截,可以指定拦截url请求目录

package com.yutao.config.baseInterceptor;

import com.yutao.dao.system.UserDao;
import com.yutao.filter.BaseInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器需要配置才可以使用,也可以在这里注入其他的类
 * @author yt
 * @create 2022/10/17 14:26
 */
@Configuration
public class BaseInterceptorConfig implements WebMvcConfigurer {

    private UserDao userDao;
    //将需要的类进行注入
    @Autowired
    public BaseInterceptorConfig(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new BaseInterceptor(userDao))// 添加拦截器
                .addPathPatterns("/**")  //添加拦截路径
                .excludePathPatterns("/swagger/**", "/swagger2/**");//排除的拦截路径(此路径不拦截)

    }
}

3 对指定方法进行拦截

这里的注册监听器,自定义监听器写法和前面一致。

如果对url目录下所有的请求进行了监听,但需要对某些请求方法不进行拦截或单独拦截,可以采用自定义注解方式,对方法加上自定义注解,拦截器进行扫描,对出现过自定义注解的方法进行单独处理

3.1 编写一个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedLogin {
    boolean LoginSuccess() default true;
}

3.2 修改拦截器

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    log.info("进入到拦截器中:preHandle() 方法");
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    NeedLogin loginVerify = handlerMethod.getMethodAnnotation(NeedLogin.class);
    if (loginVerify == null) {
        log.info("不需要对该路径 进行拦截");
        return true;
    }else {
        log.info("对该路径 进行拦截");
        log.info("业务操作...");
        return true;
    }
}

3.3 编写controller测试

@GetMapping("/test")
@NeedLogin
public String test() {
    System.out.println(LocalDateTime.now());
    return LocalDateTime.now().toString();
}

@GetMapping("/test2")
public String test2() {
    System.out.println(LocalDateTime.now());
    return LocalDateTime.now().toString();
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值