`
Dead_knight
  • 浏览: 1202274 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
752c8642-b795-3fe6-946e-a4e845bffdec
Spring Securi...
浏览量:240612
33caa84e-18a6-3036-a82b-6e2106a4de63
clojure专题
浏览量:49056
E17ca077-44df-3816-a3fe-471c43f6e1e5
WebLogic11g
浏览量:237060
社区版块
存档分类
最新评论

Spring Security3源码分析-FilterChainProxy执行过程分析

阅读更多
通过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的功能与作用了。
2
0
分享到:
评论
1 楼 xsd_旧 2015-11-08  
  

相关推荐

    Spring_Security3_源码分析

    总结,Spring Security 3的源码分析是一个深度学习的过程,涵盖了安全领域的多个方面。通过理解其内部工作机制,开发者可以更好地利用这一强大的框架,为应用程序提供安全的保障。同时,源码分析也能帮助开发者解决...

    spring security源码分析.pdf

    ### Spring Security 源码分析知识...以上内容涵盖了 Spring Security 3 的源码分析中几个关键点的具体内容。通过对这些内容的深入学习和理解,可以更好地掌握 Spring Security 的工作原理及其在实际项目中的应用技巧。

    SpringSecurity源码

    1. **过滤器链**:SpringSecurity的核心是基于过滤器的Web安全模型,它通过一系列预定义的过滤器(如`HttpSessionAuthenticationFilter`、`UsernamePasswordAuthenticationFilter`等)拦截HTTP请求,执行相应的安全...

    3.springSecurity源码分析1

    在深入分析SpringSecurity源码之前,我们先了解一些基础概念。 1. DelegatingFilterProxy:这是一个Spring框架提供的过滤器,它作为代理来调用实际的Filter。在web.xml中,filter-name设置为...

    spring-security3.1.4 完整的jar包

    3. **spring-security-config-3.1.4.RELEASE.jar**:配置模块允许开发者使用XML或注解来定义安全规则,如访问控制、角色分配等。它包含了表达式语言,使得在定义访问控制时可以使用自定义逻辑。 4. **spring-...

    初识 Spring Security - v1.1.pdf

    ### 初识 Spring Security #### 一、Spring Security 概述 **Spring Security**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架...

    Spring Security in Action

    AuthenticationManager 负责管理身份验证过程,而 AuthenticationProvider 负责执行具体的身份验证逻辑。 在 Spring Security 中,有多种身份验证机制,例如用户名密码验证、OpenID.Connect 等。...

    Spring Security 中文教程.pdf

    ### Spring Security 中文教程知识点概览 #### 一、Spring Security简介 - **Spring Security**是一种全面的安全服务框架,主要用于基于J2EE的企业应用程序。它与Spring框架紧密结合,旨在简化安全性的实现,使得...

    Spring Security-3.0.1中文官方文档(翻译版)

    Spring Security 提供了一个专门的安全命名空间,简化了安全配置的编写过程。 - **2.2.1 配置 web.xml** 为了使 Spring Security 生效,需要在 web.xml 文件中配置过滤器和监听器。 - **2.2.2 最小配置** 可以...

    spring security maven 例子

    - `DelegatingFilterProxy`:这是Spring Security与Servlet容器交互的关键,它代理到Spring Security的FilterChainProxy。 - `FilterSecurityInterceptor`:负责基于配置的安全策略来决定请求是否被允许。 - `...

    Spring Security参考手册中文版

    ### Spring Security 参考手册知识点概览 #### 一、Spring Security 概述 - **定义**:Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。 - **历史**:Spring Security 随着 Spring 框架的发展...

    spring security (-) helloWorld

    《Spring Security HelloWorld详解》 Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛应用于Java EE和Spring应用程序中。本篇文章将基于“spring security - helloWorld”项目,探讨...

    Spring Security 3.x 完整入门教程 源代码

    Spring Security 是一个强大的Java...3. **过滤器链**:Spring Security 的工作流程主要通过一系列过滤器完成,如`DelegatingFilterProxy`指向Spring Security的FilterChainProxy,后者管理着所有安全相关的过滤器,如`...

    springsecurity2 自定义filter实现

    了解了自定义Filter的基本过程后,我们还需要关注Spring Security的其他核心概念,如`FilterChainProxy`、`AccessDecisionManager`、`SecurityContextHolder`等。`FilterChainProxy`负责维护过滤器链,`...

    spring security 参考手册中文版

    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的源码分析和工具的使用。 SpringSecurity的核心概念...

    SpringSecurity3.2源代码包

    - `FilterChainProxy`:这是Spring Security的核心过滤器链,负责根据配置将请求路由到相应的过滤器。 - `AuthenticationManager`:处理用户认证,接收认证请求并返回认证结果。 - `AccessDecisionManager`:管理...

    Spring Security 3连接数据库查询实例

    在本实例中,我们将深入探讨如何配置Spring Security 3以连接数据库并执行查询,以及其核心组件的工作原理。 首先,我们看到配置文件中的 `&lt;bean id="filterChainProxy"`,这是Spring Security的核心组件之一,它...

    Spring_Security_官方文档

    `DelegatingFilterProxy`和`FilterChainProxy`是两个关键的过滤器代理,它们负责调度和执行具体的过滤器。 #### 配置与认证 配置部分深入探讨了如何通过配置来实现不同的认证机制,如Basic Authentication和Digest...

Global site tag (gtag.js) - Google Analytics