Class CookieLocaleResolver

java.lang.Object
org.springframework.web.util.CookieGenerator
org.craftercms.engine.targeting.impl.CookieLocaleResolver
All Implemented Interfaces:
org.springframework.web.servlet.LocaleContextResolver, org.springframework.web.servlet.LocaleResolver
Direct Known Subclasses:
ConfigAwareCookieLocaleResolver

public class CookieLocaleResolver extends org.springframework.web.util.CookieGenerator implements org.springframework.web.servlet.LocaleContextResolver
LocaleResolver implementation that uses a cookie sent back to the user in case of a custom setting, with a fallback to the configured default locale, the request's Accept-Language header, or the default locale for the server.

This is particularly useful for stateless applications without user sessions. The cookie may optionally contain an associated time zone value as well; alternatively, you may specify a default time zone.

Custom controllers can override the user's locale and time zone by calling #setLocale(Context) on the resolver, e.g. responding to a locale change request. As a more convenient alternative, consider using RequestContext.changeLocale(java.util.Locale).

Since:
27.02.2003
Author:
Juergen Hoeller, Jean-Pierre Pawlak
See Also:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    The default cookie name used if none is explicitly set.
    static final String
    The name of the request attribute that holds the Locale.
    static final String
    The name of the request attribute that holds the TimeZone.

    Fields inherited from class org.springframework.web.util.CookieGenerator

    DEFAULT_COOKIE_PATH, logger
  • Constructor Summary

    Constructors
    Constructor
    Description
    Create a new instance of CookieLocaleResolver using the default cookie name.
  • Method Summary

    Modifier and Type
    Method
    Description
    protected Locale
    determineDefaultLocale(jakarta.servlet.http.HttpServletRequest request)
    Determine the default locale for the given request, called if no locale cookie has been found.
    protected TimeZone
    determineDefaultTimeZone(jakarta.servlet.http.HttpServletRequest request)
    Determine the default time zone for the given request, called if no locale cookie has been found.
    protected Locale
    Return the fixed locale that this resolver will return if no cookie is found, if any.
    protected TimeZone
    Return the fixed time zone that this resolver will return if no cookie is found, if any.
    boolean
    Return whether this resolver's cookies should be compliant with BCP 47 language tags instead of Java's legacy locale specification format.
    boolean
    Return whether to reject cookies with invalid content (e.g. invalid format).
    protected Locale
    parseLocaleValue(String localeValue)
    Parse the given locale value coming from an incoming cookie.
    resolveLocale(jakarta.servlet.http.HttpServletRequest request)
     
    org.springframework.context.i18n.LocaleContext
    resolveLocaleContext(jakarta.servlet.http.HttpServletRequest request)
     
    void
    setDefaultLocale(Locale defaultLocale)
    Set a fixed locale that this resolver will return if no cookie is found.
    void
    setDefaultTimeZone(TimeZone defaultTimeZone)
    Set a fixed time zone that this resolver will return if no cookie is found.
    void
    setLanguageTagCompliant(boolean languageTagCompliant)
    Specify whether this resolver's cookies should be compliant with BCP 47 language tags instead of Java's legacy locale specification format.
    void
    setLocale(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Locale locale)
     
    void
    setLocaleContext(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, org.springframework.context.i18n.LocaleContext localeContext)
     
    void
    setRejectInvalidCookies(boolean rejectInvalidCookies)
    Specify whether to reject cookies with invalid content (e.g. invalid format).
    protected String
    Render the given locale as a text value for inclusion in a cookie.

    Methods inherited from class org.springframework.web.util.CookieGenerator

    addCookie, createCookie, getCookieDomain, getCookieMaxAge, getCookieName, getCookiePath, isCookieHttpOnly, isCookieSecure, removeCookie, setCookieDomain, setCookieHttpOnly, setCookieMaxAge, setCookieName, setCookiePath, setCookieSecure

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • LOCALE_REQUEST_ATTRIBUTE_NAME

      public static final String LOCALE_REQUEST_ATTRIBUTE_NAME
      The name of the request attribute that holds the Locale.

      Only used for overriding a cookie value if the locale has been changed in the course of the current request!

      Use RequestContext(Utils).getLocale() to retrieve the current locale in controllers or views.

      See Also:
      • RequestContext.getLocale()
      • RequestContextUtils.getLocale(jakarta.servlet.http.HttpServletRequest)
    • TIME_ZONE_REQUEST_ATTRIBUTE_NAME

      public static final String TIME_ZONE_REQUEST_ATTRIBUTE_NAME
      The name of the request attribute that holds the TimeZone.

      Only used for overriding a cookie value if the locale has been changed in the course of the current request!

      Use RequestContext(Utils).getTimeZone() to retrieve the current time zone in controllers or views.

      See Also:
      • RequestContext.getTimeZone()
      • RequestContextUtils.getTimeZone(jakarta.servlet.http.HttpServletRequest)
  • Constructor Details

  • Method Details

    • setLanguageTagCompliant

      public void setLanguageTagCompliant(boolean languageTagCompliant)
      Specify whether this resolver's cookies should be compliant with BCP 47 language tags instead of Java's legacy locale specification format.

      The default is true, as of 5.1. Switch this to false for rendering Java's legacy locale specification format. For parsing, this resolver leniently accepts the legacy Locale.toString() format as well as BCP 47 language tags in any case.

      Since:
      4.3
      See Also:
    • isLanguageTagCompliant

      public boolean isLanguageTagCompliant()
      Return whether this resolver's cookies should be compliant with BCP 47 language tags instead of Java's legacy locale specification format.
      Since:
      4.3
    • setRejectInvalidCookies

      public void setRejectInvalidCookies(boolean rejectInvalidCookies)
      Specify whether to reject cookies with invalid content (e.g. invalid format).

      The default is true. Turn this off for lenient handling of parse failures, falling back to the default locale and time zone in such a case.

      Since:
      5.1.7
      See Also:
    • isRejectInvalidCookies

      public boolean isRejectInvalidCookies()
      Return whether to reject cookies with invalid content (e.g. invalid format).
      Since:
      5.1.7
    • setDefaultLocale

      public void setDefaultLocale(@Nullable Locale defaultLocale)
      Set a fixed locale that this resolver will return if no cookie is found.
    • getDefaultLocale

      @Nullable protected Locale getDefaultLocale()
      Return the fixed locale that this resolver will return if no cookie is found, if any.
    • setDefaultTimeZone

      public void setDefaultTimeZone(@Nullable TimeZone defaultTimeZone)
      Set a fixed time zone that this resolver will return if no cookie is found.
      Since:
      4.0
    • getDefaultTimeZone

      @Nullable protected TimeZone getDefaultTimeZone()
      Return the fixed time zone that this resolver will return if no cookie is found, if any.
      Since:
      4.0
    • resolveLocale

      public Locale resolveLocale(jakarta.servlet.http.HttpServletRequest request)
      Specified by:
      resolveLocale in interface org.springframework.web.servlet.LocaleContextResolver
      Specified by:
      resolveLocale in interface org.springframework.web.servlet.LocaleResolver
    • resolveLocaleContext

      public org.springframework.context.i18n.LocaleContext resolveLocaleContext(jakarta.servlet.http.HttpServletRequest request)
      Specified by:
      resolveLocaleContext in interface org.springframework.web.servlet.LocaleContextResolver
    • setLocale

      public void setLocale(jakarta.servlet.http.HttpServletRequest request, @Nullable jakarta.servlet.http.HttpServletResponse response, @Nullable Locale locale)
      Specified by:
      setLocale in interface org.springframework.web.servlet.LocaleContextResolver
      Specified by:
      setLocale in interface org.springframework.web.servlet.LocaleResolver
    • setLocaleContext

      public void setLocaleContext(jakarta.servlet.http.HttpServletRequest request, @Nullable jakarta.servlet.http.HttpServletResponse response, @Nullable org.springframework.context.i18n.LocaleContext localeContext)
      Specified by:
      setLocaleContext in interface org.springframework.web.servlet.LocaleContextResolver
    • parseLocaleValue

      @Nullable protected Locale parseLocaleValue(String localeValue)
      Parse the given locale value coming from an incoming cookie.

      The default implementation calls StringUtils.parseLocale(String), accepting the Locale.toString() format as well as BCP 47 language tags.

      Parameters:
      localeValue - the locale value to parse
      Returns:
      the corresponding Locale instance
      Since:
      4.3
      See Also:
      • StringUtils.parseLocale(String)
    • toLocaleValue

      protected String toLocaleValue(Locale locale)
      Render the given locale as a text value for inclusion in a cookie.

      The default implementation calls Locale.toString() or Locale.toLanguageTag(), depending on the "languageTagCompliant" configuration property.

      Parameters:
      locale - the locale to convert to a string
      Returns:
      a String representation for the given locale
      Since:
      4.3
      See Also:
    • determineDefaultLocale

      protected Locale determineDefaultLocale(jakarta.servlet.http.HttpServletRequest request)
      Determine the default locale for the given request, called if no locale cookie has been found.

      The default implementation returns the configured default locale, if any, and otherwise falls back to the request's Accept-Language header locale or the default locale for the server.

      Parameters:
      request - the request to resolve the locale for
      Returns:
      the default locale (never null)
      See Also:
    • determineDefaultTimeZone

      @Nullable protected TimeZone determineDefaultTimeZone(jakarta.servlet.http.HttpServletRequest request)
      Determine the default time zone for the given request, called if no locale cookie has been found.

      The default implementation returns the configured default time zone, if any, or null otherwise.

      Parameters:
      request - the request to resolve the time zone for
      Returns:
      the default time zone (or null if none defined)
      See Also: