`
uuhorse
  • 浏览: 64860 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

SpingMVC第一个拦截器未执行BUG分析

    博客分类:
  • Java
阅读更多

问题描述:

SpringMvc项目中使用<mvc:interceptors>配置了一系列的拦截器,Web运行时发现第一个拦截器未执行。

 

问题分析:

1、第一个拦截器未注册上?

 

 

InterceptorsBeanDefinitionParser 中打断点,观察有生成对应的拦截器。

 

2、拦截器未命中?

 

AbstractHandlerMapping.getHandlerExecutionChain(Object handler, HttpServletRequest request)

 
发现规则命中,拦截器数量与MVC中配置数量一致,但是第一个拦截器确是ConversionServiceExposingInterceptor,应用中未配置该拦截器。
mappedInterceptors是在initApplicationContext()中初始化,跟踪代码进入如下片段:

 中间有一次递归调用,发现result来自两个BeanFactory,mvc中配置了四个拦截器,在此处跟踪发现在map中被覆盖,KEY值相同,为org.springframework.web.servlet.handler.MappedInterceptor#0,对应Class为ConversionServiceExposingInterceptor.class;
ConversionServiceExposingInterceptor在何处生成,为什么会有相同的BeanName,代码片段如下:

 

 String org.springframework.beans.factory.support.BeanDefinitionReaderUtils.generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry, boolean isInnerBean) throws BeanDefinitionStoreException

 


 

Generate a bean name for the given bean definition, unique within the given bean factory.

 

此代码只在一个bean工厂中保证名称唯一。

 

SpringMVC web.xml同时配置了ContextLoaderListener 和 DispatcherServlet,误将<mvc:interceptors>的配置放到了ContextLoaderListener 下,而DispatcherServlet解析<mvc:annotation-driven />时,默认注册ConversionServiceExposingInterceptor.class,生成了ID为org.springframework.web.servlet.handler.MappedInterceptor#0的拦截器,导致两个容器中的beanName重复,即处理请求时通过Map承载Interceptors的过程中导致第一个拦截器ConversionServiceExposingInterceptor覆盖。

 

 结论:涉及MVC相关的配置都要配置在DispatcherServlet中,不要一部分放到ContextLoaderListener,可能会因为名称冲突被覆盖。
  • 大小: 76.7 KB
  • 大小: 59.1 KB
  • 大小: 41.4 KB
  • 大小: 80.4 KB
  • 大小: 70.9 KB
分享到:
评论

相关推荐

    SpringMVC中的拦截器-拦截器方法的作用和执行顺序.avi

    SpringMVC中的拦截器-拦截器方法的作用和执行顺序.avi

    springMVC拦截器项目

    SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    其中,拦截器是SpringMVC的一个特性,允许开发者在进入控制器之前执行特定的操作,常用于日志记录、权限检查等场景。然而,在使用拦截器时,可能会遇到拦截器误拦截静态资源文件(如js、css、图片等)的问题。这不仅...

    SpringMVC-12 拦截器

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的任务。它提供了一种AOP(面向切面编程)的方式,让我们可以全局地处理请求,如日志记录、权限验证、性能...

    springmvc传值对象及拦截器

    1. 请求到达第一个拦截器,执行`preHandle`方法。 2. 如果`preHandle`返回`true`,则继续执行下一个拦截器的`preHandle`,直到所有拦截器的`preHandle`都完成。 3. 请求到达目标控制器,执行业务逻辑。 4. 控制器...

    SpringMVC中使用Interceptor拦截器

    在Spring MVC框架中,Interceptor(拦截器)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的逻辑。它们可以用来实现通用的功能,如权限验证、日志记录、性能统计等,避免在每个控制器方法中重复编写...

    SpringMVC拦截器

    拦截器通过在请求进入控制器前对请求进行预处理,在控制器执行完毕后对响应进行后处理,以及在请求结束后做一些清理工作,从而实现了对请求流程的灵活控制。 #### 二、使用场景 拦截器适用于处理请求中的共性问题...

    springmvc 拦截器

    这是拦截器的第一个调用点,会在Controller处理请求之前执行。如果此方法返回true,请求将继续被处理;如果返回false,Spring MVC会立即停止处理,并且不会调用后续的拦截器或Controller。 3. **postHandle方法** ...

    SpringMVC拦截器例子详解

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的逻辑。它们可以用来实现通用的功能,如权限验证、日志记录、性能统计等,避免在每个控制器方法中重复代码...

    Springmvc登录拦截器Demo

    Spring MVC支持多个拦截器组成一个拦截器链,每个拦截器的`preHandle()`方法都会按顺序执行,只有当所有拦截器都返回true时,请求才会继续被处理。如果有一个返回false,请求处理将被中断。 7. **最佳实践** - ...

    SpringMVC拦截器源代码.zip

    - 多个拦截器按照注册顺序形成一个链,每个拦截器的`preHandle`方法按顺序执行,`postHandle`和`afterCompletion`则按后进先出的顺序执行。 6. **应用场景** - 权限验证:在处理请求前检查用户是否已登录或拥有...

    SpringMVC 拦截器 实现 登录退出功能

    1. **`preHandle()`**:这是第一个被调用的方法,通常在这里进行权限验证、日志记录等操作。如果返回`true`,请求会被继续处理;如果返回`false`,则请求会被中断,不会执行后续的处理器。 2. **`postHandle()`**:...

    基于springMVC的session拦截器

    本文将深入探讨如何基于SpringMVC实现一个session拦截器,以检查用户信息是否存在。 1. **什么是Session?** Session是HTTP协议无状态性的补充,它允许服务器存储客户端会话状态。在Web应用中,当用户登录后,...

    SpringMVC 中的拦截器与异常处理

    2. 拦截器的执行流程:当一个HTTP请求到达时,SpringMVC会按照拦截器链的顺序调用`preHandle()`方法。如果所有拦截器的`preHandle()`都返回`true`,则请求会被转发到相应的控制器。在控制器处理完请求后,SpringMVC...

    企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告.docx

    在企业级开发中,SpringMVC 是一个广泛使用的框架,用于构建高效、模块化和可测试的 Web 应用程序。本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能...

    SpringMvc 拦截器

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的逻辑。它们可以用来实现通用的功能,如权限验证、日志记录、性能统计等,避免在每个控制器方法中重复编写...

    Spring Cloud OpenFeign - - - >拦截器

    初学者很容易将 Spring MVC 拦截器 和 Spring Cloud OpenFeign 拦截器搞混,误以为OpenFeign拦截器就是SpringMVC拦截器:Spring MVC拦截器发生在客户端 和 服务端之间,在客户端向服务端发送请求时进行拦截处理。...

    SpringMVC配置拦截器实现登录控制的方法

    1. 拦截器(Interceptor):SpringMVC中拦截器用于对请求进行拦截处理,比如在用户未登录时,拦截请求并进行重定向至登录页面。拦截器需要实现HandlerInterceptor接口,并重写preHandle、postHandle和...

    SpringMVC - 拦截器

    如果这个方法返回 `true`,则继续调用下一个拦截器的 `preHandle()` 方法,直到所有拦截器的 `preHandle()` 都执行完毕。接着,SpringMVC 将调用目标控制器处理请求。最后,从最后一个拦截器开始,按相反的顺序调用 ...

    SSM笔记-SpringMVC的自定义拦截器

    1. `preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`:在目标处理器执行前调用,返回值为布尔类型,如果返回`true`,则继续执行下一个拦截器或者目标处理器;如果返回`false...

Global site tag (gtag.js) - Google Analytics