拦截器是Spring MVC框架中的一个重要组件,它是一种
AOP
(面向切面编程)的实现方式,专门拦截对控制层的请求。拦截器可以用于判断用户权限、拦截WebSocket请求等。
Springboot拦截器具有多种作用,主要包括请求预处理
、请求日志记录
、鉴权和权限控制
、异常处理
等。拦截器是一种特殊的组件,可以在请求处理的过程中对请求和响应进行拦截和处理。在不修改原有代码的情况下,实现对请求和响应的统一处理。
HandlerInterceptor
接口。WebMvcConfigrer
。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("Pre Handle method is Calling");
return true; // 返回true表示继续向下执行,返回false则中断执行。
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理之后,但在视图渲染之前进行拦截
System.out.println("Post Handle method is Calling");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整个请求结束之后进行拦截,即在DispatcherServlet渲染了对应的视图之后执行。
System.out.println("Request and Response is completed");
}
}
@Configuration
public class MyConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加全局拦截
registry.addInterceptor(new MyInterceptor());
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
}
每个请求方法都会执行拦截器处理,增加项目性能消耗
要求如下:
那如何实现这样的局部拦截器呢,很简单,只要使用 Acri 框架处理即可,使用方式如下:
<dependency>
<groupId>cn.fntopgroupId>
<artifactId>acri-coreartifactId>
<version>1.1.0version>
dependency>
@Acri
注解配置项 | 默认值 | 备注 |
---|---|---|
value | null | 具体拦截处理器,实现AcriProcessor并注入Spring容器 |
before | false | 是否处理请求前执行doBefore方法 |
during | false | 是否处理请求方法后执行doDuring方法 |
after | false | 是否在返回响应后执行doAfter方法 |
//AcriStopWatchProcessor是框架自带的耗时统计拦截
//before = true 请求之前执行`AcriStopWatchProcessor.doBefore()`方法
@Acri(value = AcriStopWatchProcessor.class, before = true, during = true, after = true)
@GetMapping("/login")
public String login() {
log.info("登录中");
return "登录成功";
}
implements AcriProcessor
并注入Spring容器@Slf4j
@Component
public class LogProcessor implements AcriProcessor {
@Override
public void doBefore(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("doBefore");
}
@Override
public void doDuring(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
log.info("doDuring");
}
@Override
public void doAfter(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
log.info("doAfter");
}
}
//表示请求前执行LogProcessor.doBefore方法,请求后执行LogProcessor.doAfter()方法
//during=false表示不执行doDuring方法
@Acri(value = LogProcessor.class, before = true, during = false, after = true)
@GetMapping("/login")
public String login() {
log.info("登录中");
return "登录成功";
}
@Acries(more = {@Acri(value = AcriStopWatchProcessor.class, before = true, after = true)
, @Acri(value = LogProcessor.class, before = true, after = true)})
详细文档参考:Acri