簡體   English   中英

攔截器被叫2倍以上

[英]Interceptor is called 2 times more

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

沒有錯誤。 如果我在chrome中使用了強大的刷新功能,則所有攔截器方法都會執行兩次。 並且僅當使用頁面的messages.properties時,才會發生“問題”。

preHandle ==>控制器==> 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM