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
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user