public class CookieLocaleResolver extends CookieGenerator implements LocaleContextResolver
LocaleResolver
implementation that uses a cookie sent back to the user
in case of a custom setting, with a fallback to the specified default locale
or the request's accept-header locale.
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)
.
setDefaultLocale(java.util.Locale)
,
setDefaultTimeZone(java.util.TimeZone)
Modifier and Type | Field and Description |
---|---|
static java.lang.String |
DEFAULT_COOKIE_NAME
The default cookie name used if none is explicitly set.
|
private java.util.Locale |
defaultLocale |
private java.util.TimeZone |
defaultTimeZone |
private boolean |
languageTagCompliant |
static java.lang.String |
LOCALE_REQUEST_ATTRIBUTE_NAME
The name of the request attribute that holds the Locale.
|
static java.lang.String |
TIME_ZONE_REQUEST_ATTRIBUTE_NAME
The name of the request attribute that holds the TimeZone.
|
DEFAULT_COOKIE_PATH, logger
Constructor and Description |
---|
CookieLocaleResolver()
Create a new instance of the
CookieLocaleResolver class
using the default cookie name . |
Modifier and Type | Method and Description |
---|---|
protected java.util.Locale |
determineDefaultLocale(HttpServletRequest request)
Determine the default locale for the given request,
Called if no locale cookie has been found.
|
protected java.util.TimeZone |
determineDefaultTimeZone(HttpServletRequest request)
Determine the default time zone for the given request,
Called if no TimeZone cookie has been found.
|
protected java.util.Locale |
getDefaultLocale()
Return the fixed Locale that this resolver will return if no cookie found,
if any.
|
protected java.util.TimeZone |
getDefaultTimeZone()
Return the fixed TimeZone that this resolver will return if no cookie found,
if any.
|
boolean |
isLanguageTagCompliant()
Return whether this resolver's cookies should be compliant with BCP 47
language tags instead of Java's legacy locale specification format.
|
private void |
parseLocaleCookieIfNecessary(HttpServletRequest request) |
protected java.util.Locale |
parseLocaleValue(java.lang.String localeValue)
Parse the given locale value coming from an incoming cookie.
|
java.util.Locale |
resolveLocale(HttpServletRequest request)
Resolve the current locale via the given request.
|
LocaleContext |
resolveLocaleContext(HttpServletRequest request)
Resolve the current locale context via the given request.
|
void |
setDefaultLocale(java.util.Locale defaultLocale)
Set a fixed Locale that this resolver will return if no cookie found.
|
void |
setDefaultTimeZone(java.util.TimeZone defaultTimeZone)
Set a fixed TimeZone that this resolver will return if no cookie 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(HttpServletRequest request,
HttpServletResponse response,
java.util.Locale locale)
Set the current locale to the given one.
|
void |
setLocaleContext(HttpServletRequest request,
HttpServletResponse response,
LocaleContext localeContext)
Set the current locale context to the given one,
potentially including a locale with associated time zone information.
|
protected java.lang.String |
toLocaleValue(java.util.Locale locale)
Render the given locale as a text value for inclusion in a cookie.
|
addCookie, createCookie, getCookieDomain, getCookieMaxAge, getCookieName, getCookiePath, isCookieHttpOnly, isCookieSecure, removeCookie, setCookieDomain, setCookieHttpOnly, setCookieMaxAge, setCookieName, setCookiePath, setCookieSecure
public static final java.lang.String LOCALE_REQUEST_ATTRIBUTE_NAME
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.
public static final java.lang.String TIME_ZONE_REQUEST_ATTRIBUTE_NAME
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.
public static final java.lang.String DEFAULT_COOKIE_NAME
private boolean languageTagCompliant
@Nullable private java.util.Locale defaultLocale
@Nullable private java.util.TimeZone defaultTimeZone
public CookieLocaleResolver()
CookieLocaleResolver
class
using the default cookie name
.public void setLanguageTagCompliant(boolean languageTagCompliant)
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.
parseLocaleValue(String)
,
toLocaleValue(Locale)
,
Locale.forLanguageTag(String)
,
Locale.toLanguageTag()
public boolean isLanguageTagCompliant()
public void setDefaultLocale(@Nullable java.util.Locale defaultLocale)
@Nullable protected java.util.Locale getDefaultLocale()
public void setDefaultTimeZone(@Nullable java.util.TimeZone defaultTimeZone)
@Nullable protected java.util.TimeZone getDefaultTimeZone()
public java.util.Locale resolveLocale(HttpServletRequest request)
LocaleResolver
resolveLocale
in interface LocaleResolver
request
- the request to resolve the locale fornull
)public LocaleContext resolveLocaleContext(HttpServletRequest request)
LocaleContextResolver
This is primarily intended for framework-level processing; consider using
RequestContextUtils
or
RequestContext
for
application-level access to the current locale and/or time zone.
The returned context may be a
TimeZoneAwareLocaleContext
,
containing a locale with associated time zone information.
Simply apply an instanceof
check and downcast accordingly.
Custom resolver implementations may also return extra settings in the returned context, which again can be accessed through downcasting.
resolveLocaleContext
in interface LocaleContextResolver
request
- the request to resolve the locale context fornull
LocaleResolver.resolveLocale(HttpServletRequest)
,
RequestContextUtils.getLocale(HttpServletRequest)
,
RequestContextUtils.getTimeZone(HttpServletRequest)
private void parseLocaleCookieIfNecessary(HttpServletRequest request)
public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable java.util.Locale locale)
LocaleResolver
setLocale
in interface LocaleResolver
request
- the request to be used for locale modificationresponse
- the response to be used for locale modificationlocale
- the new locale, or null
to clear the localepublic void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable LocaleContext localeContext)
LocaleContextResolver
setLocaleContext
in interface LocaleContextResolver
request
- the request to be used for locale modificationresponse
- the response to be used for locale modificationlocaleContext
- the new locale context, or null
to clear the localeLocaleResolver.setLocale(HttpServletRequest, HttpServletResponse, Locale)
,
SimpleLocaleContext
,
SimpleTimeZoneAwareLocaleContext
@Nullable protected java.util.Locale parseLocaleValue(java.lang.String localeValue)
The default implementation calls StringUtils.parseLocale(String)
,
accepting the Locale.toString()
format as well as BCP 47 language tags.
localeValue
- the locale value to parseLocale
instanceStringUtils.parseLocale(String)
protected java.lang.String toLocaleValue(java.util.Locale locale)
The default implementation calls Locale.toString()
or JDK 7's Locale.toLanguageTag()
, depending on the
"languageTagCompliant"
configuration property.
locale
- the locale to stringifyisLanguageTagCompliant()
@Nullable protected java.util.Locale determineDefaultLocale(HttpServletRequest request)
The default implementation returns the specified default locale, if any, else falls back to the request's accept-header locale.
request
- the request to resolve the locale fornull
)setDefaultLocale(java.util.Locale)
,
javax.servlet.http.HttpServletRequest#getLocale()
@Nullable protected java.util.TimeZone determineDefaultTimeZone(HttpServletRequest request)
The default implementation returns the specified default time zone,
if any, or null
otherwise.
request
- the request to resolve the time zone fornull
if none defined)setDefaultTimeZone(java.util.TimeZone)