gpt4 book ai didi

java - 拦截器被调用2次以上

转载 作者:行者123 更新时间:2023-12-02 03:39:01 25 4
gpt4 key购买 nike

我使用 Spring i18n 库。
- ReloadableResourceBundleMessageSource
- SessionLocaleResolver
- LocaleChangeInterceptor

没有错误。如果我在chrome中使用强刷新功能,所有拦截器方法都会多执行两次。并且该问题仅在页面使用 messages.properties 时发生。

preHandle ==> Controller ==> postHandle ==> AfterCompletion 执行完毕,所有方法多执行两次。

我查看了拦截器的生命周期,但我不明白为什么拦截器无故多运行两次。


1.servlet-context.xml

<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basenames" value="/WEB-INF/messages/messages, /WEB-INF/messages/messages_ko_KR" />
</beans:bean>
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<beans:property name="defaultLocale" value="ko_KR" />
</beans:bean>
<interceptors>
<beans:bean id="localeChangeInterceptor" class="com.test.util.locale.LocaleChangeInterceptor" />
</interceptors>


2.LocaleChangeInterceptor是我自己实现的,实现起来很简单,如下面的代码。

public class LocaleChangeInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {

String language = request.getParameter("language");

System.out.println("1. preHandle(): " + language);

if(language != null) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
localeResolver.setLocale(request, response, StringUtils.parseLocaleString(language));
}

return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("2. postHandle()");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("3. afterCompletion()");
}
}


控制台

1. preHandle(): null
main.jsp
2. postHandle()
3. afterCompletion()
1. preHandle(): null
2. postHandle()
3. afterCompletion()
1. preHandle(): null
2. postHandle()
3. afterCompletion()

我不知道这是Interceptor生命周期的问题还是自然结果。

最佳答案

已解决。通过首先创建一个 Interceptor bean 解决了这个问题,然后通过引用调用注册的 bean。

这似乎是一个问题,因为我不太了解 Spring 拦截器注册。我需要了解更多信息。

<beans:bean id="localeChangeInterceptor" class="com.test.util.locale.LocaleChangeInterceptor" />

<interceptors>
<interceptor>
<mapping path="/**" />
<exclude-mapping path="/resources/**" />
<beans:ref bean="localeChangeInterceptor" />
</interceptor>
</interceptors>

关于java - 拦截器被调用2次以上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com