全局拦截器
大约 3 分钟
全局拦截器
1.什么是拦截器
拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。
2.定义拦截器步骤
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步: 1.定义拦截器; 2.注册拦截器; 3.指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
一、定义拦截器
在 Spring Boot 中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口,重写以下三个方法。

先在controller文件夹中创建UserInfoInterceptor类, implements并实现 HandlerInterceptor 接口

选择要实现的方法

代码如下
package com.example.springs.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class UserInfoInterceptor implements HandlerInterceptor {
/*
* 目标方法执行前
* 拦截请求,访问controller之前
* 返回 true 表示继续向下执行,返回 false 表示中断后续操作
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String userId = request.getHeader("userId");
String userToken = request.getHeader("userToken");
if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(userToken)){
//未登录
log.error("用户校验不通过,信息不完整");
return false;
}
//假设真实的用户id是1001,用户token是abcxyz
if(!userId.equalsIgnoreCase("1001") || !userToken.equalsIgnoreCase("abcxyz")){
log.error("用户权限不通过");
return false;
}
//放行
return true;
}
/*
* 目标方法执行后
* 请求访问到controller之后,渲染视图之前
* 可以通过此方法对请求域中的模型和视图做进一步修改
* */
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle执行{}", modelAndView);
}
/*
* 页面渲染后
* 请求访问到controller之后,渲染视图之后
* 可以通过此方法实现资源清理、记录日志信息等工作
* */
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion执行异常{}", ex);
}
}
二、注册拦截器
创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。 在controller文件夹下创建MyMvcConfig 注册类
package com.example.springs.controller;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//标记配置类,可以被springboot容器扫描到
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Bean
public UserInfoInterceptor userInfoInterceptor(){
return new UserInfoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自己的拦截器,并设置拦截的请求路径
//addPathPatterns为拦截此请求路径的请求
//excludePathPatterns为不拦截此路径的请求
registry.addInterceptor(new UserInfoInterceptor()).addPathPatterns("/admin/*").excludePathPatterns("/admin/oldLogin");
}
}
然后在controller文件夹下创建接口
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("admin")
@RestController
public class hello {
@PostMapping("user")
public String user() {
return "调用接口成功";
}
}
编译后
默认情况

打印

传入userToken和userid后

打印
这里已经放行了,依次执行了后面的流程
