Merge branch '5.1.x'
This commit is contained in:
@@ -142,7 +142,7 @@ configure(allprojects) { project ->
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkstyle {
|
checkstyle {
|
||||||
toolVersion = "8.19"
|
toolVersion = "8.20"
|
||||||
configDir = rootProject.file("src/checkstyle")
|
configDir = rootProject.file("src/checkstyle")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ dependencyManagement {
|
|||||||
// spring-core includes asm and repackages cglib, inlining both into the spring-core jar.
|
// spring-core includes asm and repackages cglib, inlining both into the spring-core jar.
|
||||||
// cglib itself depends on asm and is therefore further transformed by the JarJar task to
|
// cglib itself depends on asm and is therefore further transformed by the JarJar task to
|
||||||
// depend on org.springframework.asm; this avoids including two different copies of asm.
|
// depend on org.springframework.asm; this avoids including two different copies of asm.
|
||||||
def cglibVersion = "3.2.10"
|
def cglibVersion = "3.2.11"
|
||||||
def objenesisVersion = "3.0.1"
|
def objenesisVersion = "3.0.1"
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
|
|||||||
@@ -264,8 +264,7 @@ public interface EntityResponse<T> extends ServerResponse {
|
|||||||
Builder<T> hint(String key, Object value);
|
Builder<T> hint(String key, Object value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manipulate serialization hint with the given consumer.
|
* Customize the serialization hints with the given consumer.
|
||||||
*
|
|
||||||
* @param hintsConsumer a function that consumes the hints
|
* @param hintsConsumer a function that consumes the hints
|
||||||
* @return this builder
|
* @return this builder
|
||||||
* @since 5.1.6
|
* @since 5.1.6
|
||||||
|
|||||||
@@ -377,8 +377,7 @@ public interface ServerResponse {
|
|||||||
BodyBuilder hint(String key, Object value);
|
BodyBuilder hint(String key, Object value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manipulate serialization hint with the given consumer.
|
* Customize the serialization hints with the given consumer.
|
||||||
*
|
|
||||||
* @param hintsConsumer a function that consumes the hints
|
* @param hintsConsumer a function that consumes the hints
|
||||||
* @return this builder
|
* @return this builder
|
||||||
* @since 5.1.6
|
* @since 5.1.6
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti
|
|||||||
* @see java.util.logging.Logger#getLogger(String)
|
* @see java.util.logging.Logger#getLogger(String)
|
||||||
*/
|
*/
|
||||||
public void setWarnLogCategory(String loggerName) {
|
public void setWarnLogCategory(String loggerName) {
|
||||||
this.warnLogger = !StringUtils.isEmpty(loggerName) ? LogFactory.getLog(loggerName) : null;
|
this.warnLogger = (!StringUtils.isEmpty(loggerName) ? LogFactory.getLog(loggerName) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -138,11 +138,11 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti
|
|||||||
prepareResponse(ex, response);
|
prepareResponse(ex, response);
|
||||||
ModelAndView result = doResolveException(request, response, handler, ex);
|
ModelAndView result = doResolveException(request, response, handler, ex);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
// Print warn message when warn logger is not enabled...
|
// Print debug message when warn logger is not enabled.
|
||||||
if (logger.isDebugEnabled() && (this.warnLogger == null || !this.warnLogger.isWarnEnabled())) {
|
if (logger.isDebugEnabled() && (this.warnLogger == null || !this.warnLogger.isWarnEnabled())) {
|
||||||
logger.debug("Resolved [" + ex + "]" + (result.isEmpty() ? "" : " to " + result));
|
logger.debug("Resolved [" + ex + "]" + (result.isEmpty() ? "" : " to " + result));
|
||||||
}
|
}
|
||||||
// warnLogger with full stack trace (requires explicit config)
|
// Explicitly configured warn logger in logException method.
|
||||||
logException(ex, request);
|
logException(ex, request);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2018 the original author or authors.
|
* Copyright 2002-2019 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -56,7 +56,7 @@ import org.springframework.web.util.WebUtils;
|
|||||||
public class CookieLocaleResolver extends CookieGenerator implements LocaleContextResolver {
|
public class CookieLocaleResolver extends CookieGenerator implements LocaleContextResolver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the request attribute that holds the Locale.
|
* The name of the request attribute that holds the {@code Locale}.
|
||||||
* <p>Only used for overriding a cookie value if the locale has been
|
* <p>Only used for overriding a cookie value if the locale has been
|
||||||
* changed in the course of the current request!
|
* changed in the course of the current request!
|
||||||
* <p>Use {@code RequestContext(Utils).getLocale()}
|
* <p>Use {@code RequestContext(Utils).getLocale()}
|
||||||
@@ -67,7 +67,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||||||
public static final String LOCALE_REQUEST_ATTRIBUTE_NAME = CookieLocaleResolver.class.getName() + ".LOCALE";
|
public static final String LOCALE_REQUEST_ATTRIBUTE_NAME = CookieLocaleResolver.class.getName() + ".LOCALE";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the request attribute that holds the TimeZone.
|
* The name of the request attribute that holds the {@code TimeZone}.
|
||||||
* <p>Only used for overriding a cookie value if the locale has been
|
* <p>Only used for overriding a cookie value if the locale has been
|
||||||
* changed in the course of the current request!
|
* changed in the course of the current request!
|
||||||
* <p>Use {@code RequestContext(Utils).getTimeZone()}
|
* <p>Use {@code RequestContext(Utils).getTimeZone()}
|
||||||
@@ -85,6 +85,8 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||||||
|
|
||||||
private boolean languageTagCompliant = true;
|
private boolean languageTagCompliant = true;
|
||||||
|
|
||||||
|
private boolean rejectInvalidCookies = true;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private Locale defaultLocale;
|
private Locale defaultLocale;
|
||||||
|
|
||||||
@@ -128,14 +130,36 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a fixed Locale that this resolver will return if no cookie found.
|
* Specify whether to reject cookies with invalid content (e.g. invalid format).
|
||||||
|
* <p>The default is {@code 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 #setDefaultLocale
|
||||||
|
* @see #setDefaultTimeZone
|
||||||
|
* @see #determineDefaultLocale
|
||||||
|
* @see #determineDefaultTimeZone
|
||||||
|
*/
|
||||||
|
public void setRejectInvalidCookies(boolean rejectInvalidCookies) {
|
||||||
|
this.rejectInvalidCookies = rejectInvalidCookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether to reject cookies with invalid content (e.g. invalid format).
|
||||||
|
* @since 5.1.7
|
||||||
|
*/
|
||||||
|
public boolean isRejectInvalidCookies() {
|
||||||
|
return this.rejectInvalidCookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a fixed locale that this resolver will return if no cookie found.
|
||||||
*/
|
*/
|
||||||
public void setDefaultLocale(@Nullable Locale defaultLocale) {
|
public void setDefaultLocale(@Nullable Locale defaultLocale) {
|
||||||
this.defaultLocale = defaultLocale;
|
this.defaultLocale = defaultLocale;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the fixed Locale that this resolver will return if no cookie found,
|
* Return the fixed locale that this resolver will return if no cookie found,
|
||||||
* if any.
|
* if any.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -144,7 +168,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a fixed TimeZone that this resolver will return if no cookie found.
|
* Set a fixed time zone that this resolver will return if no cookie found.
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public void setDefaultTimeZone(@Nullable TimeZone defaultTimeZone) {
|
public void setDefaultTimeZone(@Nullable TimeZone defaultTimeZone) {
|
||||||
@@ -152,7 +176,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the fixed TimeZone that this resolver will return if no cookie found,
|
* Return the fixed time zone that this resolver will return if no cookie found,
|
||||||
* if any.
|
* if any.
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
@@ -214,16 +238,17 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (IllegalArgumentException ex) {
|
catch (IllegalArgumentException ex) {
|
||||||
String cookieDescription = "invalid locale cookie '" + cookieName +
|
if (isRejectInvalidCookies() &&
|
||||||
"': [" + value + "] due to: " + ex.getMessage();
|
request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
|
||||||
if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) != null) {
|
throw new IllegalStateException("Encountered invalid locale cookie '" +
|
||||||
// Error dispatch: ignore locale/timezone parse exceptions
|
cookieName + "': [" + value + "] due to: " + ex.getMessage());
|
||||||
if (logger.isDebugEnabled()) {
|
|
||||||
logger.debug("Ignoring " + cookieDescription);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new IllegalStateException("Encountered " + cookieDescription);
|
// Lenient handling (e.g. error dispatch): ignore locale/timezone parse exceptions
|
||||||
|
if (logger.isDebugEnabled()) {
|
||||||
|
logger.debug("Ignoring invalid locale cookie '" + cookieName +
|
||||||
|
"': [" + value + "] due to: " + ex.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (logger.isTraceEnabled()) {
|
if (logger.isTraceEnabled()) {
|
||||||
@@ -320,7 +345,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine the default time zone for the given request,
|
* Determine the default time zone for the given request,
|
||||||
* Called if no TimeZone cookie has been found.
|
* Called if no time zone cookie has been found.
|
||||||
* <p>The default implementation returns the specified default time zone,
|
* <p>The default implementation returns the specified default time zone,
|
||||||
* if any, or {@code null} otherwise.
|
* if any, or {@code null} otherwise.
|
||||||
* @param request the request to resolve the time zone for
|
* @param request the request to resolve the time zone for
|
||||||
|
|||||||
Reference in New Issue
Block a user