Java Spring HandlerInterceptor调用了两次
在一个库项目(使用Spring3.2.4)中,我定义了多个拦截器。servlet配置xml文件包含在jar中,将导入web应用程序。拦截器用于多个servlet XML,因为它们应用于具有不同拦截器的不同Dispatcher servlet 问题是,拦截器被调用了两次,而处理程序(控制器)只被调用了一次 拦截器在库项目中定义:Java Spring HandlerInterceptor调用了两次,java,spring,spring-mvc,Java,Spring,Spring Mvc,在一个库项目(使用Spring3.2.4)中,我定义了多个拦截器。servlet配置xml文件包含在jar中,将导入web应用程序。拦截器用于多个servlet XML,因为它们应用于具有不同拦截器的不同Dispatcher servlet 问题是,拦截器被调用了两次,而处理程序(控制器)只被调用了一次 拦截器在库项目中定义: public class SomeInterceptor extends HandlerInterceptorAdapter { @Override
public class SomeInterceptor extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final Exception ex) throws Exception {
System.out.println("afterCompletionCalled");
}
@Override
public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {
System.out.println("preHandle called");
return true;
}
@Override
public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ModelAndView modelAndView) throws Exception {
}
}
servlet配置在jar文件中提供,稍后包含在应用程序中
libservletcfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:component-scan base-package="com.example.controller" annotation-config="true" />
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
</list>
</property>
</bean>
<mvc:annotation-driven />
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.example.SomeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
检查是否没有另一个libservletcfg.xml挂起classpath*:将匹配它们。我们遇到了两次调用拦截器的相同问题,这是因为我们在web.xml以及@Configuration java文件中定义了applicationContext.xml。您需要使用org.springframework.web.servlet.asynchHandlerInterceptor:
public interface AsyncHandlerInterceptor extends HandlerInterceptor {
void afterConcurrentHandlingStarted(
HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
}
Spring MVCexecute序列:
preHandle
afterConcurrentHandlingStarted
preHandle
postHandle
afterCompletion
发现并验证了我自己
希望这有帮助 我也面临同样的问题,拦截器被调用了两次。 问题是在根配置类的@ComponentScan声明中,创建了两个实例,一个在web上下文中,另一个在根上下文中
因此,从根上下文中删除拦截器包后,问题得到了解决。发布一个拦截器被调用两次的处理程序方法示例。在问题中添加了一个示例。尝试调试并检查您的
HandlerInterceptor
的两个实例是否已注册。是否注册了。有两个不同的HandlerInterceptor
实例。到达断点的顺序:Instance1.preHandle(…)、Instance2.preHandle(…)、Handler、Instance2.postHandle(…)、Instance1.postHandle(…),情况并非如此。我在IDE中搜索了所有配置文件,甚至在提取的war文件中搜索了libservletcfg.xml的出现情况,我只找到了一个。你可能是对的,但因为项目在一段时间前关闭了。我仍然会将你的回答标记为正确,因为这很可能是原因。我不认为,这是事实,因为我只标记了一次,根据这个答案()它是注定要发生的。你的链接不起作用,请更新它好吗?
@Controller
@RequestMapping(value = "/someUrl")
public class SampleController {
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody SampleResponseBody sampleMethod(@RequestBody final SampleRequestBody pSampleRequestBody) {
final SampleResponseBody response = new SampleResponseBody();
return response;
}
}
public interface AsyncHandlerInterceptor extends HandlerInterceptor {
void afterConcurrentHandlingStarted(
HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
}
preHandle
afterConcurrentHandlingStarted
preHandle
postHandle
afterCompletion