From 803d7b50b9bf59ecc534e1db9b7be7c79cd3c2f1 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 27 Aug 2015 20:55:50 +0200 Subject: [PATCH] Skip HttpServletResponse.getStatus() on Servlet 2.5 Prior to this commit, ServletWebRequest would call HttpServletResponse.getStatus(), which is a Servlet 3.x method. This commit checks if this method is available before calling it, thus keeping Servlet 2.5 compatibility. Issue: SPR-13396 --- .../web/context/request/ServletWebRequest.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java b/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java index a7114e46c1a..74adcc76781 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/ServletWebRequest.java @@ -27,6 +27,7 @@ import javax.servlet.http.HttpSession; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -54,6 +55,10 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ private static final String METHOD_HEAD = "HEAD"; + /** Checking for Servlet 3.0+ HttpServletResponse.getStatus() */ + private static final boolean responseGetStatusAvailable = + ClassUtils.hasMethod(HttpServletResponse.class, "getStatus"); + private boolean notModified = false; @@ -173,7 +178,7 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ public boolean checkNotModified(long lastModifiedTimestamp) { HttpServletResponse response = getResponse(); if (lastModifiedTimestamp >= 0 && !this.notModified) { - if (response == null || HttpStatus.valueOf(response.getStatus()).is2xxSuccessful()) { + if (isCompatibleWithConditionalRequests(response)) { this.notModified = isTimestampNotModified(lastModifiedTimestamp); if (response != null) { if (this.notModified && supportsNotModifiedStatus()) { @@ -188,6 +193,12 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ return this.notModified; } + private boolean isCompatibleWithConditionalRequests(HttpServletResponse response) { + return response == null + || !responseGetStatusAvailable + || HttpStatus.valueOf(response.getStatus()).is2xxSuccessful(); + } + @SuppressWarnings("deprecation") private boolean isTimestampNotModified(long lastModifiedTimestamp) { long ifModifiedSince = -1; @@ -215,7 +226,7 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ public boolean checkNotModified(String etag) { HttpServletResponse response = getResponse(); if (StringUtils.hasLength(etag) && !this.notModified) { - if (response == null || HttpStatus.valueOf(response.getStatus()).is2xxSuccessful()) { + if (isCompatibleWithConditionalRequests(response)) { etag = addEtagPadding(etag); this.notModified = isETagNotModified(etag); if (response != null) { @@ -265,7 +276,7 @@ public class ServletWebRequest extends ServletRequestAttributes implements Nativ public boolean checkNotModified(String etag, long lastModifiedTimestamp) { HttpServletResponse response = getResponse(); if (StringUtils.hasLength(etag) && !this.notModified) { - if (response == null || HttpStatus.valueOf(response.getStatus()).is2xxSuccessful()) { + if (isCompatibleWithConditionalRequests(response)) { etag = addEtagPadding(etag); this.notModified = isETagNotModified(etag) && isTimestampNotModified(lastModifiedTimestamp); if (response != null) {