【springbot整合拦截器】

张开发
2026/4/13 2:18:28 15 分钟阅读

分享文章

【springbot整合拦截器】
springboot 整合拦截器纯AI查询整理的供自己查看用不清晰的自己再搜下其他资料拦截器的概述作用拦截 Controller 请求在进入 Controller 之前 / 之后 / 渲染页面前后做处理典型场景登录校验、日志、权限、接口限流、请求头处理只拦截 Controller不拦截静态资源、过滤器Filter范围更大整合拦截器步骤编辑拦截器packagecom.example.demo002.interceptor;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;ComponentpublicclassLoginInterceptorimplementsHandlerInterceptor{/** * 进入Controller之前执行 */OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(【拦截器】preHandle请求进入Controller前);// 示例判断是否登录Objectuserrequest.getSession().getAttribute(user);if(usernull){response.getWriter().write(请先登录);returnfalse;// 不放行}returntrue;// 放行}/** * Controller执行完毕渲染页面前执行 */OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(【拦截器】postHandleController执行完);}/** * 整个请求完全结束后执行 */OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(【拦截器】afterCompletion请求结束);}}preHandle是进入Controller之前执行但是postHandle和afterCompletion具体是什么区别呢首先执行顺序如下请求流程preHandle → Controller执行 → postHandle → 视图渲染 → afterCompletion详细区别postHandleController 执行完视图渲染前修改 ModelAndView 对象添加额外的模型数据或修改视图名称在响应返回给客户端之前进行最后的数据处理限制如果 Controller 抛出异常这个方法不会执行afterCompletion整个请求完全结束执行时机视图渲染完成响应已经发送给客户端资源清理关闭连接、释放锁等记录日志记录请求总耗时性能监控特点无论是否发生异常这个方法都会执行参数 Exception ex可以获取请求过程中发生的异常如果没有异常则为 null注册拦截器拦截器必须注册才能生效。为什么需要注册虽然你在 LoginInterceptor 类上加了 Component 注解但这只是让它被 Spring 容器管理并不会自动注册为拦截器。你需要通过配置类明确告诉 Spring MVC哪些请求路径需要被拦截哪些请求路径需要排除创建新的一个拦截器和上面的基本一样根据自己需要来创建。packagecom.example.demo002.interceptor;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;ComponentpublicclassTestInterCeptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 记录请求开始时间request.setAttribute(startTime,System.currentTimeMillis());System.out.println(【拦截器】preHandle请求进入Controller前);returntrue;}OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{// 可以在这里添加额外的模型数据if(modelAndView!null){modelAndView.addObject(commonData,公共数据);}System.out.println(【拦截器】postHandleController执行完视图渲染前);}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{// 计算请求总耗时LongstartTime(Long)request.getAttribute(startTime);longendTimeSystem.currentTimeMillis();System.out.println(【拦截器】afterCompletion请求结束耗时(endTime-startTime)ms);// 如果有异常记录异常信息if(ex!null){System.out.println(【拦截器】发生异常ex.getMessage());}}}2.创建拦截器配置类你需要创建一个配置类来实现 WebMvcConfigurer 接口packagecom.example.demo002.config;importcom.example.demo002.interceptor.LoginInterceptor;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{AutowiredprivateLoginInterceptorloginInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(loginInterceptor).addPathPatterns(/**)// 拦截所有路径.excludePathPatterns(// 排除不需要拦截的路径/login,// 登录接口/register,// 注册接口/static/**,// 静态资源/css/**,/js/**,/images/**);}}3.总结Spring Boot 拦截器 实现 HandlerInterceptor 注册到 WebMvcConfigurer只拦截 Controller不拦截静态资源三个方法preHandle /postHandle/afterCompletion可配置拦截、放行路径

更多文章