Java 当我使用CookieLocaleResolver时,我可以设置无效cookie以使SpringWeb应用程序崩溃

Java 当我使用CookieLocaleResolver时,我可以设置无效cookie以使SpringWeb应用程序崩溃,java,spring,spring-mvc,cookies,Java,Spring,Spring Mvc,Cookies,在web.xml中: <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> <listener> <listener-class>org.springfr

在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>
然后,我尝试创建自己的mycokielocalleresolver类来捕获所有异常并返回默认的语言环境实例:

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" />
尝试仅使用“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>

在我重写了两个方法后,它工作正常:

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");
            }
        };
    }
}

}

自4.3版以来,有一个新的参数
languageTag Compliant
,它支持languageTag解析

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

使用Spring 5.2.1上的
setLanguageTagCompliant
时出现相同错误。
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);
            }
        };
    }
}
<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>
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");
            }
        };
    }
}
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setLanguageTagCompliant(true);