Java 当我使用CookieLocaleResolver时,我可以设置无效cookie以使SpringWeb应用程序崩溃
在web.xml中: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
<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);