Do not execute ResourceUrlEncodingFilter only once per request
In case the filter is also registered to the ERROR dispatcher, the following happens: * the filter is executed once for the regular execution * the filter should be executed a second time when dispatched to error Since the filter is a `OncePerRequestFilter`, the filter is only executed once and won't be executed when handling the error. This can lead to situations like spring-projects/spring-boot#7348 This commit makes this filter a simple `GenericFilterBean`. Issue: SPR-14891
This commit is contained in:
@@ -19,6 +19,8 @@ package org.springframework.web.servlet.resource;
|
||||
import java.io.IOException;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpServletResponseWrapper;
|
||||
@@ -26,7 +28,7 @@ import javax.servlet.http.HttpServletResponseWrapper;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
import org.springframework.web.filter.GenericFilterBean;
|
||||
import org.springframework.web.util.UrlPathHelper;
|
||||
|
||||
/**
|
||||
@@ -41,16 +43,20 @@ import org.springframework.web.util.UrlPathHelper;
|
||||
* @author Brian Clozel
|
||||
* @since 4.1
|
||||
*/
|
||||
public class ResourceUrlEncodingFilter extends OncePerRequestFilter {
|
||||
public class ResourceUrlEncodingFilter extends GenericFilterBean {
|
||||
|
||||
private static final Log logger = LogFactory.getLog(ResourceUrlEncodingFilter.class);
|
||||
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||
throws ServletException, IOException {
|
||||
|
||||
filterChain.doFilter(request, new ResourceUrlEncodingResponseWrapper(request, response));
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
|
||||
throws IOException, ServletException {
|
||||
if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) {
|
||||
throw new ServletException("ResourceUrlEncodingFilter just supports HTTP requests");
|
||||
}
|
||||
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
||||
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
||||
filterChain.doFilter(httpRequest, new ResourceUrlEncodingResponseWrapper(httpRequest, httpResponse));
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user