通过FilterChainProxy的初始化、自定义标签的分析后,Spring Security需要的运行环境已经准备好了。
这样当用户访问应用时,过滤器就开始工作了。web.xml配置的Filter:org.springframework.web.filter.DelegatingFilterProxy就不介绍了,该类仅仅是初始化一个FilterChainProxy,然后把所有拦截的请求交给FilterChainProxy处理。
FilterChainProxy的doFilter方法如下
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//FilterInvocation类封装了request、response、chain
//在方法中传递
FilterInvocation fi = new FilterInvocation(request, response, chain);
//获取http标签中创建的所有Filter
List<Filter> filters = getFilters(fi.getRequestUrl());
if (filters == null || filters.size() == 0) {
if (logger.isDebugEnabled()) {
logger.debug(fi.getRequestUrl() +
filters == null ? " has no matching filters" : " has an empty filter list");
}
chain.doFilter(request, response);
return;
}
//把实际doFilter任务交给VirtualFilterChain处理
VirtualFilterChain virtualFilterChain = new VirtualFilterChain(fi, filters);
virtualFilterChain.doFilter(fi.getRequest(), fi.getResponse());
}
现在来分析VirtualFilterChain的doFilter方法:
private static class VirtualFilterChain implements FilterChain {
private FilterInvocation fi;
private List<Filter> additionalFilters;
private int currentPosition = 0;
private VirtualFilterChain(FilterInvocation filterInvocation, List<Filter> additionalFilters) {
this.fi = filterInvocation;
this.additionalFilters = additionalFilters;
}
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
//判断过滤器的个数是否与当前位置相等
if (currentPosition == additionalFilters.size()) {
if (logger.isDebugEnabled()) {
logger.debug(fi.getRequestUrl()
+ " reached end of additional filter chain; proceeding with original chain");
}
fi.getChain().doFilter(request, response);
} else {
//当前位置加一
currentPosition++;
//根据当前位置从过滤器列表中取出一个Filter
Filter nextFilter = additionalFilters.get(currentPosition - 1);
if (logger.isDebugEnabled()) {
logger.debug(fi.getRequestUrl() + " at position " + currentPosition + " of "
+ additionalFilters.size() + " in additional filter chain; firing Filter: '"
+ nextFilter + "'");
}
//执行取出Filter的doFilter方法
nextFilter.doFilter(request, response, this);
}
}
}
注意这里
nextFilter.doFilter(request, response, this);
VirtualFilterChain把自身作为参数传递给doFilter方法,这样doFilter方法最后会调用VirtualFilterChain的doFilter方法,这样控制就又回到了VirtualFilterChain,于是VirtualFilterChain又将当前位置currentPosition前移,调用下一个Filter的doFilter方法。当additionalFilters中所有元素的doFilter都执行完毕,VirtualFilterChain执行fi.getChain().doFilter,而fi.getChain()的值就是FilterChainProxy的doFilter方法中的参数chain的值。
这样我们就理解了FilterChainProxy是如何处理整个Filter链的了。
接下来,就要一一分析每个Filter的功能与作用了。
分享到:
相关推荐
总结,Spring Security 3的源码分析是一个深度学习的过程,涵盖了安全领域的多个方面。通过理解其内部工作机制,开发者可以更好地利用这一强大的框架,为应用程序提供安全的保障。同时,源码分析也能帮助开发者解决...
### Spring Security 源码分析知识...以上内容涵盖了 Spring Security 3 的源码分析中几个关键点的具体内容。通过对这些内容的深入学习和理解,可以更好地掌握 Spring Security 的工作原理及其在实际项目中的应用技巧。
1. **过滤器链**:SpringSecurity的核心是基于过滤器的Web安全模型,它通过一系列预定义的过滤器(如`HttpSessionAuthenticationFilter`、`UsernamePasswordAuthenticationFilter`等)拦截HTTP请求,执行相应的安全...
在深入分析SpringSecurity源码之前,我们先了解一些基础概念。 1. DelegatingFilterProxy:这是一个Spring框架提供的过滤器,它作为代理来调用实际的Filter。在web.xml中,filter-name设置为...
3. **spring-security-config-3.1.4.RELEASE.jar**:配置模块允许开发者使用XML或注解来定义安全规则,如访问控制、角色分配等。它包含了表达式语言,使得在定义访问控制时可以使用自定义逻辑。 4. **spring-...
### 初识 Spring Security #### 一、Spring Security 概述 **Spring Security**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架...
AuthenticationManager 负责管理身份验证过程,而 AuthenticationProvider 负责执行具体的身份验证逻辑。 在 Spring Security 中,有多种身份验证机制,例如用户名密码验证、OpenID.Connect 等。...
### Spring Security 中文教程知识点概览 #### 一、Spring Security简介 - **Spring Security**是一种全面的安全服务框架,主要用于基于J2EE的企业应用程序。它与Spring框架紧密结合,旨在简化安全性的实现,使得...
Spring Security 提供了一个专门的安全命名空间,简化了安全配置的编写过程。 - **2.2.1 配置 web.xml** 为了使 Spring Security 生效,需要在 web.xml 文件中配置过滤器和监听器。 - **2.2.2 最小配置** 可以...
- `DelegatingFilterProxy`:这是Spring Security与Servlet容器交互的关键,它代理到Spring Security的FilterChainProxy。 - `FilterSecurityInterceptor`:负责基于配置的安全策略来决定请求是否被允许。 - `...
### Spring Security 参考手册知识点概览 #### 一、Spring Security 概述 - **定义**:Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。 - **历史**:Spring Security 随着 Spring 框架的发展...
《Spring Security HelloWorld详解》 Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛应用于Java EE和Spring应用程序中。本篇文章将基于“spring security - helloWorld”项目,探讨...
Spring Security 是一个强大的Java...3. **过滤器链**:Spring Security 的工作流程主要通过一系列过滤器完成,如`DelegatingFilterProxy`指向Spring Security的FilterChainProxy,后者管理着所有安全相关的过滤器,如`...
了解了自定义Filter的基本过程后,我们还需要关注Spring Security的其他核心概念,如`FilterChainProxy`、`AccessDecisionManager`、`SecurityContextHolder`等。`FilterChainProxy`负责维护过滤器链,`...
3. Spring Security 4.2的新特性 27 3.1 Web改进 27 3.2配置改进 28 3.3杂项 28 4.样品和指南(从这里开始) 28 5. Java配置 29 5.1 Hello Web安全Java配置 29 5.1.1 AbstractSecurityWebApplicationInitializer 31 ...
这篇博文的作者通过实际操作分享了他在使用SpringSecurity时的经验,虽然描述中并未给出具体细节,但我们可以从标题和标签中推测,本文可能涉及了SpringSecurity的源码分析和工具的使用。 SpringSecurity的核心概念...
- `FilterChainProxy`:这是Spring Security的核心过滤器链,负责根据配置将请求路由到相应的过滤器。 - `AuthenticationManager`:处理用户认证,接收认证请求并返回认证结果。 - `AccessDecisionManager`:管理...
在本实例中,我们将深入探讨如何配置Spring Security 3以连接数据库并执行查询,以及其核心组件的工作原理。 首先,我们看到配置文件中的 `<bean id="filterChainProxy"`,这是Spring Security的核心组件之一,它...
`DelegatingFilterProxy`和`FilterChainProxy`是两个关键的过滤器代理,它们负责调度和执行具体的过滤器。 #### 配置与认证 配置部分深入探讨了如何通过配置来实现不同的认证机制,如Basic Authentication和Digest...