2014-11-22 2 views
1

을 충돌 유효하지 않은 쿠키를 설정할 수 있습니다, 나는 web.xml에 스프링 웹 애플리케이션

스프링 디스패처-servlet.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> 

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

를 applicationContext.xml

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

client-lang 쿠키의 내용을 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 클래스를 만들려고 :

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 인 localsResolver 인스턴스의 인스턴스가 아닌 것 같습니다. 항상 CookieLocaleResolver 인스턴스를 사용합니다. 어떻게 localeResolver 인스턴스를 DispatcherServlet으로 설정할 수 있습니까? 기본 로케일로 "EN"만을 사용하여

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

답변

0

시도 : 나는이 두 가지 방법을 오버라이드 후

<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> 
0

, 그것을 잘 작동합니다 :

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

}

관련 문제