FilterSecurityInterceptor
Declare
package org.springframework.security.web.access.intercept;
public class FilterSecurityInterceptor
extends AbstractSecurityInterceptor
implements Filter
Class Jdoc
通过过滤器实现对HTTP资源执行安全处理。
这个安全拦截器所需的SecurityMetadataSource类型为FilterInvocationSecurityMetadataSource。
有关工作流的详细信息,请参阅AbstractSecurityInterceptor。
doFilter
Declared
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
FilterInvocation fi = new FilterInvocation(request, response, chain);
invoke(fi);
}
Method Jdoc
实际上是由过滤器链调用的方法。它只需将其委托给invoke(FilterInvocation)方法。
invoke
Method Code
public void invoke(FilterInvocation fi) throws IOException, ServletException {
if ((fi.getRequest() != null)
&& (fi.getRequest().getAttribute(FILTER_APPLIED) != null)
&& observeOncePerRequest) {
// filter already applied to this request and user wants us to observe
// once-per-request handling, so don't re-do security checking
// 过滤器已经应用到这个请求,且用户希望我们每个请求处理一次,所以不要重复检查
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
}
else {
// first time this request being called, so perform security checking
// 第一次调用此请求,执行安全性检查
if (fi.getRequest() != null && observeOncePerRequest) {
fi.getRequest().setAttribute(FILTER_APPLIED, Boolean.TRUE);
}
InterceptorStatusToken token = super.beforeInvocation(fi);
try {
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
}
finally {
super.finallyInvocation(token);
}
super.afterInvocation(token, null);
}
}
isObserveOncePerRequest
Method Jdoc
表明是否每个请求只执行一次,默认值为true,这意味着FilterSecurityInterceptor将只对每个请求执行一次。有时,用户可能希望它对每个请求执行一次以上,例如当使用JSP转发时,希望对每个包含的HTTP请求片段执行过滤安全性。
Method Code
public boolean isObserveOncePerRequest() {
return observeOncePerRequest;
}