1、拦截器
拦截器是啥?
在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
可以用于“身份校验”或者“日志记录”等等操作
1.1 引入依赖
依赖:
spring-boot-starter-web
<dependencies>
<!-- 项目启动依赖 @Service @Component @RestController tomcat等等 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.3</version>
</dependency>
</dependencies>
1.2 代码实现
- 第一步:实现
HandlerInterceptor
接口
package sany.cxp.interceptor.controller.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Author: Thomas
* @Date: 2023-08-02 15:50:38
* @Description:
*/
public class UserLoginAuthInterceptor implements HandlerInterceptor {
/** 在请求处理之前进行调用(Controller方法调用之前)
* @param request : 请求(通过请求获取token登陆凭证)
* @param response : 返回给前端的响应
* @param handler : 该参数中包含了对应方法的信息。比如:方法中的参数类型、参数的注解、方法的注解等信息。
* @return : 返回false, 拦截器执行到此处将不会继续操作; 返回true,继续执行后面的controller操作。
* @throws Exception : 向上抛出异常
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了preHandler方法,准备执行controller方法。");
// 登录校验或者日志打印等等
// 返回false, 拦截器执行到此处将不会继续操作; 返回true,继续执行后面的controller操作。
return true;
}
/**
* controller方法调用执行之后,视图渲染之前执行!!
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("controller方法执行完成,准备执行postHandle方法。");
}
/**
* 整个请求结束之后被调用(视图渲染之后执行),主要用于清理资源,如UserLoginInfoThreadLocalUtil.clear();
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("执行了afterCompletion方法,清理缓存资源。");
}
}
- 第二步:实现
WebMvcConfigurer
接口
1、添加
@Configuration
注解,不然拦截器不会生效;2、注解了
@Bean
的方法,必须标注为public;
package sany.cxp.interceptor.config;
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;
import sany.cxp.interceptor.controller.interceptor.UserLoginAuthInterceptor;
/**
* @Author: Thomas
* @Date: 2023-08-02 16:39:53
* @Description:
*/
@Configuration
public class WebInterceptorConfigure implements WebMvcConfigurer {
/**
* UserLoginAuthInterceptor类上没有@Controller、@Component、@Service、@Repository、@Configuration时候,
* 可以通过这样的方式进行注入!!!
*/
@Bean
public UserLoginAuthInterceptor userLoginAuthInterceptor(){
return new UserLoginAuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userLoginAuthInterceptor())
.addPathPatterns("/**") // 拦截所有方法,排除以“/user/noLogin/”开头的所有URL路径,排除以"*.json"结尾的所有路径。
.excludePathPatterns("/sany/interceptor/noLogin/**")
.excludePathPatterns("/*/*.json");
}
}
1.3 执行
- 调用
- java端查看