Когда я использовал CookieLocaleResolver, я могу установить недопустимый файл cookie для сбоя весеннего веб-приложения.

2

В web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
    <display-name>Spring MVC Servlet</display-name>
    <servlet-name>spring-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

В spring-dispatcher-servlet.xml

<context:component-scan base-package="lei.spring.mvc.controller" />

В applicationContext.xml

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:cookieName="clientLang" />

После того, как я установил содержимое cookie clientLang в en-CA, Spring возвращает только следующее исключение в мой браузер:

java.lang.IllegalArgumentException: Locale part "en-CA" contains invalid characters
at org.springframework.util.StringUtils.validateLocalePart(StringUtils.java:710)
at org.springframework.util.StringUtils.parseLocaleString(StringUtils.java:690)
at org.springframework.web.servlet.i18n.CookieLocaleResolver.parseLocaleCookieIfNecessary(CookieLocaleResolver.java:164)
at org.springframework.web.servlet.i18n.CookieLocaleResolver.resolveLocaleContext(CookieLocaleResolver.java:136)
at org.springframework.web.servlet.DispatcherServlet.buildLocaleContext(DispatcherServlet.java:1043)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:955)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)

Затем я пытаюсь создать свой собственный класс MyCookieLocaleResolver, чтобы поймать все исключения и вернуть стандартный экземпляр Locale по умолчанию:

public class MyCookieLocaleResolver extends CookieLocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
    try {
        return super.resolveLocale(request);
    } catch (Exception exception) {
        return new Locale.Builder().setLanguage("en").setRegion("CA").build();
    }
}
}

изменил applicationContext.xml на:

<bean id="localeResolver" class="package.MyCookieLocaleResolver" p:cookieName="clientLang" />

Но весна по-прежнему возвращает то же исключение в мой браузер. Я прочитал код DispatcherServlet. Кажется, экземпляр this.localeResolver имеет значение NULL, но не из экземпляра localeResolver. Он всегда использует экземпляр CookieLocaleResolver. Как установить экземпляр localeResolver в DispatcherServlet?

protected LocaleContext buildLocaleContext(final HttpServletRequest request) {

    if (this.localeResolver instanceof LocaleContextResolver) {
        return ((LocaleContextResolver) this.localeResolver).resolveLocaleContext(request);
    }
    else {
        return new LocaleContext() {
            @Override
            public Locale getLocale() {
                return localeResolver.resolveLocale(request);
            }
        };
    }
}
Теги:
spring
spring-mvc
cookies

3 ответа

2

После того, как я переопределил два метода, он отлично работает:

public class MyCookieLocaleResolver extends CookieLocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
    try {
        return super.resolveLocale(request);
    } catch (Exception exception) {
        return Locale.forLanguageTag("en-CA");
    }
}

@Override
public LocaleContext resolveLocaleContext(final HttpServletRequest request) {
    try {
        return super.resolveLocaleContext(request);
    } catch (Exception exception) {
        return new LocaleContext() {
            @Override
            public Locale getLocale() {
                return Locale.forLanguageTag("en-CA");
            }
        };
    }
}

}

0

Начиная с версии 4.3 появился новый параметр languageTagCompliant который разрешает разбор languageTag

CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setLanguageTagCompliant(true);
0

попробуйте использовать только "en" в качестве стандартного языка:

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="en" />
    <property name="cookieName" value="clientLang" />
    <property name="cookieMaxAge" value="31556926" />
</bean>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню