package acegi.utils;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.acegisecurity.ConfigAttributeDefinition;
import org.acegisecurity.intercept.web.FilterInvocation;
import org.acegisecurity.intercept.web.FilterInvocationDefinitionSource;
import org.acegisecurity.util.FilterChainProxy;
public class IncludedFilterChainProxy extends FilterChainProxy {
public static final String INCLUDE_REQUEST_CONTEXT_PATH = "javax.servlet.include.context_path";
public static final String INCLUDE_REQUEST_SERVLET_PATH = "javax.servlet.include.servlet_path";
public static final String INCLUDE_REQUEST_PATH_INFO = "javax.servlet.include.path_info";
public static final String INCLUDE_REQUEST_QUERY_STRING = "javax.servlet.include.query_string";
public static final String INCLUDE_REQUEST_URI_ATTR = "javax.servlet.include.request_uri";
/**
* We override the setter to wrap the source with one that uses the included URI.
*/
@Override
public void setFilterInvocationDefinitionSource(final FilterInvocationDefinitionSource filterInvocationDefinitionSource) {
FilterInvocationDefinitionSource source = new FilterInvocationDefinitionSource() {
/**
* Accesses the ConfigAttributeDefinition
that applies to a given secure object.
Returns
* null
if no ConfigAttribiteDefinition
applies.
ObjectDefinitionSource
implementation is able to provide
* ConfigAttributeDefinition
s for the indicated secure object type.
*/
public boolean supports(final Class clazz) {
return filterInvocationDefinitionSource.supports(clazz);
}
};
super.setFilterInvocationDefinitionSource(source);
}
private static boolean isInclude(final HttpServletRequest request) {
return request.getAttribute(INCLUDE_REQUEST_URI_ATTR) != null;
}
/**
* Obtains the web application-specific fragment of the URL from the incude data.
*
* @return the URL, excluding any server name, context path or servlet path
*/
private static String buildRequestUrl(HttpServletRequest req) {
String servletPath = (String) req.getAttribute(INCLUDE_REQUEST_SERVLET_PATH);
String requestURI = (String) req.getAttribute(INCLUDE_REQUEST_URI_ATTR);
String contextPath = (String) req.getAttribute(INCLUDE_REQUEST_CONTEXT_PATH);
String pathInfo = (String) req.getAttribute(INCLUDE_REQUEST_PATH_INFO);
String queryString = (String) req.getAttribute(INCLUDE_REQUEST_QUERY_STRING);
String uri = servletPath;
if (uri == null) {
uri = requestURI;
uri = uri.substring(contextPath.length());
}
return uri + ((pathInfo == null) ? "" : pathInfo) + ((queryString == null) ? "" : ("?" + queryString));
}
}