介绍
Interceptor(拦截器)是在Web开发中用于拦截处理请求和响应的一种机制。它类似于Filter(过滤器),但提供了更精细的控制和功能。
在Java Web开发中,Interceptor主要用于拦截处理请求的控制器(如Spring MVC中的Controller)的调用过程,并可以在该过程中执行一些预处理和后处理逻辑。它可以用于实现诸如身份验证、授权、日志记录、性能监控等功能。Interceptor通常与框架(如Spring MVC)紧密结合使用。
以下是Interceptor的一些关键特点和用法:
拦截器链:Interceptor可以形成一个拦截器链,按照定义的顺序依次执行,可以有多个Interceptor组成一个链。这样可以实现不同拦截器的协同工作,每个拦截器都可以对请求进行处理或修改。
预处理和后处理:Interceptor提供了预处理和后处理的机制。在请求到达控制器之前,Interceptor可以进行一些预处理操作,如参数校验、权限验证等。在控制器处理完请求并生成响应后,Interceptor可以对响应进行后处理操作,如记录日志、添加额外的响应头等。
取消或继续处理:Interceptor可以决定是否取消或继续处理请求。通过返回
true
或false
来控制请求的继续流程。如果拦截器返回false
,则请求将被取消,后续拦截器和控制器将不会执行;如果返回true
,则请求将继续进行后续拦截器和控制器的处理。可配置性:Interceptor通常可以通过配置进行启用和禁用,并可以指定拦截的URL模式或特定的控制器。这样可以灵活地控制哪些请求需要被拦截器处理。
多个拦截器的顺序:在拦截器链中,可以通过配置指定多个拦截器的顺序。这种顺序可以影响拦截器的执行顺序,从而实现不同拦截器之间的逻辑关系。
Demo
项目核心代码如下:
WebMvcConfig
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* CodeCoderCoding
* 配置拦截器
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/myInterceptor");
}
}
MyInterceptor
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* CodeCoderCoding
* 创建拦截器
* 拦截器中的方法按照preHandle -> Controller -> postHandle -> afterCompletion的执行顺序
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler){
System.out.println("myInterceptor->preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView){
System.out.println("myInterceptor->postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex){
System.out.println("myInterceptor->afterCompletion");
}
}
InterceptorController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author CodeCoderCoding
*/
@RestController
public class InterceptorController {
@GetMapping("/myInterceptor")
public String myInterceptor(){
return "myInterceptor";
}
@GetMapping("/myInterceptor1")
public String myInterceptor1(){
return "myInterceptor1";
}
}