Java:拦截器(Interceptor)
拦截器和过滤器之间的区别是什么?
自定义拦截器
1. 创建拦截器类:让类实现HandlerInterceptor接口,重写接口中的三个方法
@Component //定义拦截器类,实现HandlerInterceptor接口 public class ProjectInterceptor implements HandlerInterceptor { @Override //原始方法调用前执行的内容 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."); return true; } @Override //原始方法调用后执行的内容 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle..."); } @Override //原始方法调用完成后执行的内容 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion..."); } }
注意:拦截器中的preHandler
方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了。
Handle是指Controller的内容
2. 配置拦截器类:在WebMvcConfigurer
中注册该拦截器,并告诉spring
哪些路径需要拦截,哪些路径不需要拦截
@Configuration public class InterceperConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //添加拦截器 InterceptorRegistration interceptorRegistration = registry.addInterceptor(new ProjectInterceptor()); //如下的路径不拦截,多个路径用逗号分隔 interceptorRegistration.excludePathPatterns("/demo/test2"); //拦截如下路径 interceptorRegistration.addPathPatterns("/**"); } }
拦截只是指会进入preHandle,不意味着不执行Controller。只有再preHandle返回的是false时才不会执行Controller。
2.1. 配置多个拦截器
拦截器的运行顺序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构