SpringBoot 项目创建 Interceptor (拦截器)

Java中的拦截器( Interceptor )是一种设计模式,它允许在请求到达目标方法之前或之后执行一些操作。在Web应用中,拦截器常常用于实现诸如日志记录、权限检查、性能监控、事务管理等功能。

SpringBoot 拦截器是 AOP 的一种实现,专门拦截对控制层的请求,主要应用于判断用户权限,拦截 webSocket 请求。

拦截器的 主要作用 包括以下三种,其实也就是对应 HandlerInterceptor 接口中的三个方法的作用。

  • 预处理:在请求到达目标方法之前,可以执行一些必要的操作,如检查用户权限、解析请求参数等。
  • 后处理:在请求处理完毕后,可以执行一些后续操作,如记录日志、清理资源等。
  • 通用逻辑:将多个控制器中通用的逻辑提取到拦截器中,减少代码重复。

在SpringBoot中可以通过实现 HandlerInterceptor 接口来创建一个拦截器。这个接口下需要重写以下三个方法:

  • preHandle :该方法在控制器处理请求之前执行,返回值表示是否中断后续操作。 true 标识不中断,继续执行。 false 表示中断后续操作。
  • postHandle :该方法在控制器处理请求之后执行,在试图渲染之前执行,可以处理后续逻辑,对视图做修改。
  • afterCompletion :该方法在整个请求完成后调用,即视图渲染之后,这里可以编写一些清理资源的逻辑。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前调用
        // 这里可以编写预处理逻辑,如权限检查等
        System.out.println("控制器处理请求之前执行");
        return true; // 返回true表示继续执行下一个拦截器或目标方法,返回false表示中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在请求处理之后调用,但在视图渲染之前
        // 这里可以编写后处理逻辑,如记录日志等
        System.out.println("控制器处理请求之后,视图渲染之前调用");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在整个请求完成后调用,即视图渲染之后
        // 这里可以编写一些清理资源的逻辑
        System.out.println("视图渲染之后调用");
    }
}

实现拦截器后需要在Spring Boot的 配置类 中注册这个拦截器,并指定它应该拦截哪些路径。

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;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**") // 拦截所有路径,你可以根据需要修改为特定的路径
                .excludePathPatterns("/exclude/**"); // 排除特定路径,不被拦截
    }
}

在指定拦截器拦截规则时,有两个方法:

  • addPathPatterns :该方法用于指定拦截路径,例如拦截路径为 /** ,表示拦截所有请求,包括对静态资源的请求。
  • excludePathPatterns :该方法用于 排除拦截路径 ,即指定不需要被拦截器拦截的请求。

当你发送请求到Spring Boot应用时,MyInterceptor 中的方法会根据程序的响应阶段而被调用,执行拦截逻辑。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值