Polishing in ForwardedHeaderFilter
See gh-30828
This commit is contained in:
@@ -165,6 +165,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
|
|||||||
doFilterInternal(request, response, filterChain);
|
doFilterInternal(request, response, filterChain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hide "Forwarded" or "X-Forwarded-*" headers.
|
* Hide "Forwarded" or "X-Forwarded-*" headers.
|
||||||
*/
|
*/
|
||||||
@@ -235,7 +236,6 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
private final ForwardedPrefixExtractor forwardedPrefixExtractor;
|
private final ForwardedPrefixExtractor forwardedPrefixExtractor;
|
||||||
|
|
||||||
|
|
||||||
ForwardedHeaderExtractingRequest(HttpServletRequest servletRequest) {
|
ForwardedHeaderExtractingRequest(HttpServletRequest servletRequest) {
|
||||||
super(servletRequest);
|
super(servletRequest);
|
||||||
|
|
||||||
@@ -252,11 +252,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
this.remoteAddress = ForwardedHeaderUtils.parseForwardedFor(uri, headers, request.getRemoteAddress());
|
this.remoteAddress = ForwardedHeaderUtils.parseForwardedFor(uri, headers, request.getRemoteAddress());
|
||||||
|
|
||||||
String baseUrl = this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port);
|
// Use Supplier as Tomcat updates delegate request on FORWARD
|
||||||
Supplier<HttpServletRequest> delegateRequest = () -> (HttpServletRequest) getRequest();
|
Supplier<HttpServletRequest> requestSupplier = () -> (HttpServletRequest) getRequest();
|
||||||
this.forwardedPrefixExtractor = new ForwardedPrefixExtractor(delegateRequest, baseUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
this.forwardedPrefixExtractor = new ForwardedPrefixExtractor(
|
||||||
|
requestSupplier, (this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port)));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -335,22 +336,22 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
private String requestUrl;
|
private String requestUrl;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor with required information.
|
* Constructor with required information.
|
||||||
* @param delegateRequest supplier for the current
|
* @param delegate supplier for the current
|
||||||
* {@link HttpServletRequestWrapper#getRequest() delegate request} which
|
* {@link HttpServletRequestWrapper#getRequest() delegate request} which
|
||||||
* may change during a forward (e.g. Tomcat.
|
* may change during a forward (e.g. Tomcat.
|
||||||
* @param baseUrl the host, scheme, and port based on forwarded headers
|
* @param baseUrl the host, scheme, and port based on forwarded headers
|
||||||
*/
|
*/
|
||||||
public ForwardedPrefixExtractor(Supplier<HttpServletRequest> delegateRequest, String baseUrl) {
|
public ForwardedPrefixExtractor(Supplier<HttpServletRequest> delegate, String baseUrl) {
|
||||||
this.delegate = delegateRequest;
|
this.delegate = delegate;
|
||||||
this.baseUrl = baseUrl;
|
this.baseUrl = baseUrl;
|
||||||
this.actualRequestUri = delegateRequest.get().getRequestURI();
|
this.actualRequestUri = delegate.get().getRequestURI();
|
||||||
|
|
||||||
this.forwardedPrefix = initForwardedPrefix(delegateRequest.get());
|
// Keep call order
|
||||||
|
this.forwardedPrefix = initForwardedPrefix(delegate.get());
|
||||||
this.requestUri = initRequestUri();
|
this.requestUri = initRequestUri();
|
||||||
this.requestUrl = initRequestUrl(); // Keep the order: depends on requestUri
|
this.requestUrl = initRequestUrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -388,7 +389,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String initRequestUrl() {
|
private String initRequestUrl() {
|
||||||
return this.baseUrl + (this.requestUri != null ? this.requestUri : this.delegate.get().getRequestURI());
|
return (this.baseUrl + (this.requestUri != null ? this.requestUri : this.delegate.get().getRequestURI()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -410,11 +411,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void recalculatePathsIfNecessary() {
|
private void recalculatePathsIfNecessary() {
|
||||||
|
// Path of delegate request changed, e.g. FORWARD on Tomcat
|
||||||
if (!this.actualRequestUri.equals(this.delegate.get().getRequestURI())) {
|
if (!this.actualRequestUri.equals(this.delegate.get().getRequestURI())) {
|
||||||
// Underlying path change (e.g. Servlet FORWARD).
|
|
||||||
this.actualRequestUri = this.delegate.get().getRequestURI();
|
this.actualRequestUri = this.delegate.get().getRequestURI();
|
||||||
|
// Keep call order
|
||||||
this.requestUri = initRequestUri();
|
this.requestUri = initRequestUri();
|
||||||
this.requestUrl = initRequestUrl(); // Keep the order: depends on requestUri
|
this.requestUrl = initRequestUrl();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -426,13 +428,11 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
private final HttpServletRequest request;
|
private final HttpServletRequest request;
|
||||||
|
|
||||||
|
|
||||||
ForwardedHeaderExtractingResponse(HttpServletResponse response, HttpServletRequest request) {
|
ForwardedHeaderExtractingResponse(HttpServletResponse response, HttpServletRequest request) {
|
||||||
super(response);
|
super(response);
|
||||||
this.request = request;
|
this.request = request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendRedirect(String location) throws IOException {
|
public void sendRedirect(String location) throws IOException {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user