96SEO 2026-02-19 17:16 13
这里写目录标题基本概念HandlerInterceptor拦截器HandlerInterceptor讲解MethodInterceptor拦截器二者的区别基本概念

在web开发中拦截器是经常用到的功能。
它可以帮我们预先设置数据以及统计方法的执行效率等等。
Spring中拦截器主要分两种一个是HandlerInterceptor一个是MethodInterceptor。
HandlerInterceptor是SpringMVC项目中的拦截器它拦截的目标是请求的地址比MethodInterceptor先执行。
其工作原理是当请求来时先进行预处理如下
通过HandlerInterceptor实现打印请求开始和结束的日志代码如下
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency拦截器
org.springframework.stereotype.Component;
org.springframework.web.servlet.HandlerInterceptor;
org.springframework.web.servlet.ModelAndView;import
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;Slf4j
{log.info(request.getRequestURI()
afterCompletion(HttpServletRequest
{log.info(request.getRequestURI()
lombok.RequiredArgsConstructor;
org.springframework.context.annotation.Configuration;
org.springframework.web.servlet.config.annotation.InterceptorRegistry;
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration
easyLogControllerInterceptor;Overridepublic
addInterceptors(InterceptorRegistry
{//addPathPatterns用于添加拦截路径//excludePathPatterns用于添加不拦截的路径registry.addInterceptor(easyLogControllerInterceptor).addPathPatterns(/test/user);}//此方法用于配置静态资源路径Overridepublic
addResourceHandlers(ResourceHandlerRegistry
{registry.addResourceHandler(/**).addResourceLocations(classpath:/my/);}
c.x.d.c.EasyLogControllerInterceptor
c.xhy.demo01.controller.HelloController
c.x.d.c.EasyLogControllerInterceptor
/test/user执行结束HandlerInterceptor讲解
实现一个HandlerInterceptor拦截器可以直接实现HandlerInterceptor接口也可以继承HandlerInterceptorAdapter类。
这两种方法殊途同归其实HandlerInterceptorAdapter也就是声明了HandlerInterceptor接口中所有方法的默认实现而我们在继承他之后只需要重写必要的方法即可。
下面就是HandlerInterceptorAdapter的代码可以看到一个方法只是默认返回true另外两个是空方法
org.springframework.web.servlet.HandlerInterceptor;
org.springframework.web.servlet.ModelAndView;import
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;public
afterCompletion(HttpServletRequest
{}}这三个方法都是干什么的有什么作用什么时候调用不同的拦截器之间是怎样的调用顺序呢
这还得参考一下DispatcherServlet的doDispatch方法
代码有点长但是它封装了SpringMVC处理请求的整个过程。
首先根据请求找到对应的HandlerExecutionChain它包含了处理请求的handler和所有的HandlerInterceptor拦截器然后在调用hander之前分别调用每个HandlerInterceptor拦截器的preHandle方法若有一个拦截器返回false则会调用triggerAfterCompletion方法并且立即返回不再往下执行若所有的拦截器全部返回true并且没有出现异常则调用handler返回ModelAndView对象再然后分别调用每个拦截器的postHandle方法最后即使是之前的步骤抛出了异常也会执行triggerAfterCompletion方法。
MethodInterceptor是AOP项目中的拦截器它拦截的目标是方法即使不是controller中的方法
上面的两种拦截器都能起到拦截的效果但是他们拦截的目标不一样实现的机制不同所以有的时候适用不同的场景。
HandlerInterceptoer拦截的是请求地址所以针对请求地址做一些验证、预处理等操作比较合适。
当你需要统计请求的响应时间时MethodInterceptor将不太容易做到因为它可能跨越很多方法或者只涉及到已经定义好的方法中一部分代码。
MethodInterceptor利用的是AOP的实现机制在本文中只说明了使用方式关于原理和机制方面介绍的比较少因为要说清楚这些需要讲出AOP的相当一部分内容。
在对一些普通的方法上的拦截HandlerInterceptoer就无能为力了这时候只能利用AOP的MethodInterceptor。
另外还有一个跟拦截器类似的东西----Filter。
Filter是Servlet规范规定的不属于Spring框架也是用于请求的拦截。
但是它适合更粗粒度的拦截在请求前后做一些编解码处理、日志记录等。
而拦截器则可以提供更细粒度的更加灵活的针对某些请求、某些方法的组合的解决方案。
另外用过人人网的ROSE框架的人都会非常喜欢它的拦截器功能。
因为它实现了全注解的方式只要在类的名字上加上拦截器的注解即表示这是一个拦截器。
而使用这个拦截器的方法或者controller也只需在方法或controller的上面加上这个拦截器的注解。
其实这是一个关注点的转变spring的切面控制在配置文件中配置文件关注哪些地方需要拦截。
而在ROSE中则是在需要拦截的地方关注我要被谁拦截。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback