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

标签 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.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 为 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);
            }
        };
    }
}

最佳答案

在我重写了两个方法之后,它工作得很好:

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/

相关文章:

java - bean 中方法属性的可见性(线程安全与否?!)

java - 交换从电子邮件地址推导出的用户名 DOMAIN\USERNAME\MAILBOX

java - 如何从 Log4j Logger/Appender 中排除单个类?

java - 如何在 JScrollPane 中显示底部组件?

java - 在运行时重新初始化 spring 中的 bean

java - 如何在 JavaScript 中访问在 AJAX 请求中作为响应发送的自定义 Java 对象?

java - Spring : create object with id from another table

java - 我在 if-else 循环中收到 java.util.EmptyStackException 。堆栈实现哪里出了问题?

java - 从实现类覆盖自定义 jar 文件中的配置属性时,entityManagerFactory 中出现错误

java - LocalVariableTableParameterNameDiscoverer 不起作用