|
46 | 46 | import org.springframework.util.Assert;
|
47 | 47 | import org.springframework.web.filter.DelegatingFilterProxy;
|
48 | 48 | import org.springframework.web.filter.GenericFilterBean;
|
| 49 | +import org.springframework.web.filter.ServletRequestPathFilter; |
49 | 50 |
|
50 | 51 | /**
|
51 | 52 | * Delegates {@code Filter} requests to a list of Spring-managed filter beans. As of
|
@@ -162,6 +163,8 @@ public class FilterChainProxy extends GenericFilterBean {
|
162 | 163 |
|
163 | 164 | private FilterChainDecorator filterChainDecorator = new VirtualFilterChainDecorator();
|
164 | 165 |
|
| 166 | + private Filter springWebFilter = new ServletRequestPathFilter(); |
| 167 | + |
165 | 168 | public FilterChainProxy() {
|
166 | 169 | }
|
167 | 170 |
|
@@ -210,27 +213,29 @@ private void doFilterInternal(ServletRequest request, ServletResponse response,
|
210 | 213 | throws IOException, ServletException {
|
211 | 214 | FirewalledRequest firewallRequest = this.firewall.getFirewalledRequest((HttpServletRequest) request);
|
212 | 215 | HttpServletResponse firewallResponse = this.firewall.getFirewalledResponse((HttpServletResponse) response);
|
213 |
| - List<Filter> filters = getFilters(firewallRequest); |
214 |
| - if (filters == null || filters.isEmpty()) { |
215 |
| - if (logger.isTraceEnabled()) { |
216 |
| - logger.trace(LogMessage.of(() -> "No security for " + requestLine(firewallRequest))); |
| 216 | + this.springWebFilter.doFilter(firewallRequest, firewallResponse, (r, s) -> { |
| 217 | + List<Filter> filters = getFilters(firewallRequest); |
| 218 | + if (filters == null || filters.isEmpty()) { |
| 219 | + if (logger.isTraceEnabled()) { |
| 220 | + logger.trace(LogMessage.of(() -> "No security for " + requestLine(firewallRequest))); |
| 221 | + } |
| 222 | + firewallRequest.reset(); |
| 223 | + this.filterChainDecorator.decorate(chain).doFilter(firewallRequest, firewallResponse); |
| 224 | + return; |
217 | 225 | }
|
218 |
| - firewallRequest.reset(); |
219 |
| - this.filterChainDecorator.decorate(chain).doFilter(firewallRequest, firewallResponse); |
220 |
| - return; |
221 |
| - } |
222 |
| - if (logger.isDebugEnabled()) { |
223 |
| - logger.debug(LogMessage.of(() -> "Securing " + requestLine(firewallRequest))); |
224 |
| - } |
225 |
| - FilterChain reset = (req, res) -> { |
226 | 226 | if (logger.isDebugEnabled()) {
|
227 |
| - logger.debug(LogMessage.of(() -> "Secured " + requestLine(firewallRequest))); |
| 227 | + logger.debug(LogMessage.of(() -> "Securing " + requestLine(firewallRequest))); |
228 | 228 | }
|
229 |
| - // Deactivate path stripping as we exit the security filter chain |
230 |
| - firewallRequest.reset(); |
231 |
| - chain.doFilter(req, res); |
232 |
| - }; |
233 |
| - this.filterChainDecorator.decorate(reset, filters).doFilter(firewallRequest, firewallResponse); |
| 229 | + FilterChain reset = (req, res) -> { |
| 230 | + if (logger.isDebugEnabled()) { |
| 231 | + logger.debug(LogMessage.of(() -> "Secured " + requestLine(firewallRequest))); |
| 232 | + } |
| 233 | + // Deactivate path stripping as we exit the security filter chain |
| 234 | + firewallRequest.reset(); |
| 235 | + chain.doFilter(req, res); |
| 236 | + }; |
| 237 | + this.filterChainDecorator.decorate(reset, filters).doFilter(firewallRequest, firewallResponse); |
| 238 | + }); |
234 | 239 | }
|
235 | 240 |
|
236 | 241 | /**
|
@@ -447,4 +452,23 @@ public FilterChain decorate(FilterChain original, List<Filter> filters) {
|
447 | 452 |
|
448 | 453 | }
|
449 | 454 |
|
| 455 | + private static final class FirewallFilter implements Filter { |
| 456 | + |
| 457 | + private final HttpFirewall firewall; |
| 458 | + |
| 459 | + private FirewallFilter(HttpFirewall firewall) { |
| 460 | + this.firewall = firewall; |
| 461 | + } |
| 462 | + |
| 463 | + @Override |
| 464 | + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) |
| 465 | + throws IOException, ServletException { |
| 466 | + HttpServletRequest request = (HttpServletRequest) servletRequest; |
| 467 | + HttpServletResponse response = (HttpServletResponse) servletResponse; |
| 468 | + filterChain.doFilter(this.firewall.getFirewalledRequest(request), |
| 469 | + this.firewall.getFirewalledResponse(response)); |
| 470 | + } |
| 471 | + |
| 472 | + } |
| 473 | + |
450 | 474 | }
|
0 commit comments