@ -31,7 +31,6 @@ import javax.servlet.Filter;
import javax.servlet.FilterChain ;
import javax.servlet.FilterChain ;
import javax.servlet.ServletException ;
import javax.servlet.ServletException ;
import javax.servlet.ServletRequest ;
import javax.servlet.ServletRequest ;
import javax.servlet.ServletRequestWrapper ;
import javax.servlet.ServletResponse ;
import javax.servlet.ServletResponse ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import javax.servlet.http.HttpServletResponse ;
@ -115,7 +114,7 @@ import java.util.*;
* @author Carlos Sanchez
* @author Carlos Sanchez
* @author Ben Alex
* @author Ben Alex
* @author Luke Taylor
* @author Luke Taylor
*
* @author Rob Winch
* /
* /
public class FilterChainProxy extends GenericFilterBean {
public class FilterChainProxy extends GenericFilterBean {
//~ Static fields/initializers =====================================================================================
//~ Static fields/initializers =====================================================================================
@ -160,7 +159,7 @@ public class FilterChainProxy extends GenericFilterBean {
return ;
return ;
}
}
VirtualFilterChain vfc = new VirtualFilterChain ( url , chain , filters ) ;
VirtualFilterChain vfc = new VirtualFilterChain ( url , chain , filters , fwRequest ) ;
vfc . doFilter ( fwRequest , fwResponse ) ;
vfc . doFilter ( fwRequest , fwResponse ) ;
}
}
@ -287,15 +286,17 @@ public class FilterChainProxy extends GenericFilterBean {
private static class VirtualFilterChain implements FilterChain {
private static class VirtualFilterChain implements FilterChain {
private final FilterChain originalChain ;
private final FilterChain originalChain ;
private final List < Filter > additionalFilters ;
private final List < Filter > additionalFilters ;
private final FirewalledRequest firewalledRequest ;
private final String url ;
private final String url ;
private final int size ;
private final int size ;
private int currentPosition = 0 ;
private int currentPosition = 0 ;
private VirtualFilterChain ( String url , FilterChain chain , List < Filter > additionalFilters ) {
private VirtualFilterChain ( String url , FilterChain chain , List < Filter > additionalFilters , FirewalledRequest firewalledRequest ) {
this . originalChain = chain ;
this . originalChain = chain ;
this . url = url ;
this . url = url ;
this . additionalFilters = additionalFilters ;
this . additionalFilters = additionalFilters ;
this . size = additionalFilters . size ( ) ;
this . size = additionalFilters . size ( ) ;
this . firewalledRequest = firewalledRequest ;
}
}
public void doFilter ( ServletRequest request , ServletResponse response ) throws IOException , ServletException {
public void doFilter ( ServletRequest request , ServletResponse response ) throws IOException , ServletException {
@ -305,7 +306,7 @@ public class FilterChainProxy extends GenericFilterBean {
}
}
// Deactivate path stripping as we exit the security filter chain
// Deactivate path stripping as we exit the security filter chain
resetWrapper ( request ) ;
this . firewalledRequest . reset ( ) ;
originalChain . doFilter ( request , response ) ;
originalChain . doFilter ( request , response ) ;
} else {
} else {
@ -322,16 +323,6 @@ public class FilterChainProxy extends GenericFilterBean {
nextFilter . doFilter ( request , response , this ) ;
nextFilter . doFilter ( request , response , this ) ;
}
}
}
}
private void resetWrapper ( ServletRequest request ) {
while ( request instanceof ServletRequestWrapper ) {
if ( request instanceof FirewalledRequest ) {
( ( FirewalledRequest ) request ) . reset ( ) ;
break ;
}
request = ( ( ServletRequestWrapper ) request ) . getRequest ( ) ;
}
}
}
}
public interface FilterChainValidator {
public interface FilterChainValidator {