【问题标题】:Interceptor is called 2 times more拦截器被调用了 2 次
【发布时间】:2019-07-02 06:14:07
【问题描述】:

我使用 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()

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

【问题讨论】:

    标签: java spring internationalization interceptor


    【解决方案1】:

    已解决。 通过首先创建一个 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多