Browse Source

Merge branch '5.1.x'

pull/22870/head
Juergen Hoeller 7 years ago
parent
commit
52657b68ea
  1. 2
      build.gradle
  2. 2
      spring-core/spring-core.gradle
  3. 3
      spring-webflux/src/main/java/org/springframework/web/reactive/function/server/EntityResponse.java
  4. 3
      spring-webflux/src/main/java/org/springframework/web/reactive/function/server/ServerResponse.java
  5. 6
      spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java
  6. 57
      spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java

2
build.gradle

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

2
spring-core/spring-core.gradle

@ -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 {

3
spring-webflux/src/main/java/org/springframework/web/reactive/function/server/EntityResponse.java

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

3
spring-webflux/src/main/java/org/springframework/web/reactive/function/server/ServerResponse.java

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

6
spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java

@ -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;

57
spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java

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

Loading…
Cancel
Save