gpt4 book ai didi

java - 当我使用 CookieLocaleResolver 时,我可以设置无效的 cookie 使 spring web 应用程序崩溃

转载 作者:行者123 更新时间:2023-11-30 08:59:51 24 4
gpt4 key购买 nike

在 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" />

我将clientLang cookie的内容设置为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" />

但是 spring 仍然向我的浏览器返回相同的异常。我阅读了 DispatcherServlet 的代码。似乎实例 this.localeResolver 为空,它不是来自 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);
}
};
}
}

最佳答案

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

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

关于java - 当我使用 CookieLocaleResolver 时,我可以设置无效的 cookie 使 spring web 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27073953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com