安全过滤器链 
Spring Security的web架构是完全基于标准的servlet过滤器的。它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc),所以它没有与任何特定的web技术强行关联。 它只管处理HttpServletRequest和HttpServletResponse,不关心请求时来自浏览器,web服务客户端,HttpInvoker还是一个AJAX应用。

Spring Security维护了一个过滤器链,每个过滤器拥有特定的功能,过滤器需要服务也会对应添加和删除。过滤器的次序是非常重要的,它们之间都有依赖关系。 如果你已经使用了命名空间配置,过滤器会自动帮你配置, 你不需要定义任何SpringBean,但是有时候你需要完全控制Spring过滤器链,因为你使用了命名空间没有提供的特性,或者你需要使用你自己自定义的类。

1. DelegatingFilterProxy 
当使用servlet过滤器时,你很需要在你的web.xml中声明它们, 它们可能被servlet容器忽略。在SpringSecurity,过滤器类也是定义在xml中的spring bean, 因此可以获得Spring的依赖注入机制和生命周期接口。spring的DelegatingFilterProxy提供了在 web.xml和applicationcontext之间的联系。

当使用DelegatingFilterProxy,你会看到像web.xml文件中的这样内容:

myFilter org.springframework.web.filter.DelegatingFilterProxy myFilter /*  
注意这个过滤器其实是一个DelegatingFilterProxy,这个过滤器里没有实现过滤器的任何逻辑。DelegatingFilterProxy做的事情是代理Filter的方法,从application context里获得bean。这让bean可以获得spring web application context的生命周期支持,使配置较为轻便。bean必须实现javax.servlet.Filter接口,它必须和filter-name里定义的名称是一样的。查看DelegatingFilterProxy的javadoc获得更多信息。

2. FilterChainProxy 
现在应该清楚了,你可以声明每个Spring Security过滤器bean,你在application context中需要的。把一个DelegatingFilterProxy入口添加到web.xml, 确认它们的次序是正确的。这是一种繁琐的方式,会让web.xml显得十分杂乱,如果我们配置了太多过滤器的话。我们最好添加一个单独的入口,在web.xml中,然后在application context中处理实体,管理我们的web安全bean。 这就是FilterChainProxy所做的事情。它使用DelegatingFilterProxy(就像上面例子中那样),但是对应的class是org.springframework.security.web.FilterChainProxy。过滤器链是在application context中声明的。这里有一个例子:

<sec:filter-chain-mappath-type="ant"><sec:filter-chainpattern=" ebservices="" *"="" filters="securityContextPersistenceFilterWithASCFalse,basicAuthenticationFilter, exceptionTranslationFilter,filterSecurityInterceptor"> 
你可能注意到FilterSecurityInterceptor声明的不同方式。命名空间元素filter-chain-map被用来设置安全过滤器链。它映射一个特定的URL模式,到过滤器链中,从bean名称来定义的filters元素。它同时支持正则表达式和ant路径,并且只使用第一个出现的匹配URI。在运行阶段FilterChainProxy会定位当前web请求匹配的第一个URI模式,由filters属性指定的过滤器bean列表将开始处理请求。过滤器会按照定义的顺序依次执行,所以你可以对处理特定URL的过滤器链进行完全的控制。

你可能注意到了,我们在过滤器链里声明了两个SecurityContextPersistenceFilter(ASC是allowSessionCreation的简写,是SecurityContextPersistenceFilter的一个属性)。因为web服务从来不会在请求里带上jsessionid,为每个用户代理都创建一个HttpSession完全是一种浪费。如果你需要构建一个高等级最高可扩展性的系统,我们推荐你使用上面的配置方法。对于小一点儿的项目,使用一个HttpSessionContextIntegrationFilter(让它的allowSessionCreation默认为true)就足够了。

在有关声明周期的问题上,如果这些方法被FilterChainProxy自己调用,FilterChainProxy会始终根据下一层的Filter代理init(FilterConfig)和destroy()方法。这时,FilterChainProxy会保证初始化和销毁操作只会在Filter上调用一次,而不管它在过滤器链中被声明了多少次)。你控制着所有的抉择,比如这些方法是否被调用或targetFilterLifecycle初始化参数DelegatingFilterProxy。默认情况下,这个参数是false,servlet容器生命周期调用不会传播到DelegatingFilterProxy。

当我们了解如何使用命名控制配置构建web安全。我们使用一个DelegatingFilterProxy,它的名字是“springSecurityFilterChain”。你应该现在可以看到FilterChainProxy的名字,它是由命名空间创建的。

2.1. 绕过过滤器链 
通过命名空间,你可以使用filters = "none",来提供一个过滤器bean列表。这会朝向请求模式,使用安全过滤器链整体。注意任何匹配这个模式的路径不会有任何授权或校验的服务起作用,它们是可以自由访问的。

3. 过滤器顺序 
定义在web.xml里的过滤器的顺序是非常重要的。不论你实际使用的是哪个过滤器, 的顺序应该像下面这样:

ChannelProcessingFilter,因为它可能需要重定向到其他协议。

ConcurrentSessionFilter,因为它不使用SecurityContextHolder功能,但是需要更新SessionRegistry 来从主体中放映正在进行的请求。

SecurityContextPersistenceFilter,这样 SecurityContext可以在web请求的开始阶段通过SecurityContextHolder建立,然后SecurityContext的任何修改都会在web请求结束的时候(为下一个web请求做准备)复制到HttpSession中。

验证执行机制 - UsernamePasswordAuthenticationFilter,CasAuthenticationFilter, BasicAuthenticationFilter 等等 - 这样SecurityContextHolder 可以被修改,并包含一个合法的 Authentication请求标志。

SecurityContextHolderAwareRequestFilter,如果,你使用它,把一个SpringSecurity提醒HttpServletRequestWrapper安装到你的servlet容器里。

RememberMeAuthenticationFilter,这样如果之前的验证执行机制没有更新SecurityContextHolder,这个请求提供了一个可以使用的remember-me服务的cookie,一个对应的已保存的Authentication对象会被创建出来。

AnonymousAuthenticationFilter,这样如果之前的验证执行机制没有更新SecurityContextHolder,会创建一个匿名Authentication对象。

ExceptionTranslationFilter,用来捕捉 SpringSecurity异常,这样,可能返回一个HTTP错误响应,或者执行一个对应的AuthenticationEntryPoint。

FilterSecurityInterceptor,保护web URI。

4. 使用其他过滤器 —— 基于框架  
如果你在使用SiteMesh,确认Spring Security过滤器在SiteMesh过滤器之前调用。这可以保证SecurityContextHolder为每个SiteMesh渲染器及时创建。

5. 其他配置例子  
方法一:  
web.xml配置一个  
  
DelegatingFilterProxy   
org.springframework.web.filter.DelegatingFilterProxy   
  
targetBeanName   
myFilter  //自己过滤器的名字  
  
  
targetFilterLifecycle   
true

DelegatingFilterProxy   
/*   
  
方法二:  
web.xml配置一个  
  
myFilter   
org.springframework.web.filter.DelegatingFilterProxy   
  
targetFilterLifecycle   
true

myFilter   
/*

方法一或者二不同的地方就是在web.xml中的写法不同而已没有太大的区别,配完web.xml之后还要配置applicationContext.xml中的bean。  
applicationContext.xml配置:  
//指名具体的filter类  
<propertyname="service"> //需要注入的具体参数  
<refbean="service">  
  
  
//这里的service封装了所有对数据库的操作  
<propertyname="target">  
<beanclass="com.maimaiche.service.maimaicheserviceimpl">  
......

--------------------------------------------------  
1、web.xml  
14379709.67309

Java代码 
  1. appFilters
  2. class >org.springframework.web.filter.DelegatingFilterProxy class>
  3. targetFilterLifecycle
  4. true
  5. appFilters
  6. /*

2、applicationContext-filter.xml

Java代码  "quality="high" allowscriptaccess="always"type="application/x-shockwave-flash"pluginspage="http://www.macromedia.com/go/getflashplayer">  
    1. "appFilters" class = "org.springframework.security.util.FilterChainProxy" >
    2. "ant" >
    3. "characterEncodingFilter,commonParamsFilter"
    4. pattern="/**"/>
    5. "characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter">
    6. "encoding" value="UTF-8"/>
    7. "forceEncoding" value="true"/>
    8. "commonParamsFilter" class="com.renren.wap.fuxi.filter.CommonParamsFilter"/>

spring DelegatingFilterProxy管理过滤器的更多相关文章

  1. 使用 Spring 容器管理 Filter

    当我们用Filter时,往往需要使用一些辅助的service,在普通的java中,只要声明(set,get方法)后在spring-application配置文件中配置就可以了,但是由于Filter与L ...

  2. spring DelegatingFilterProxy的原理及运用

    DelegatingFilterProxy的原理及使用 DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过Spring容器来管理serv ...

  3. Spring DelegatingFilterProxy解析

    以前DelegatingFilterProxy是在需要使用spring security 的时候在xml中配置,如下: <filter> <filter-name>spring ...

  4. Spring Security入门(1-12)Spring Security 的过滤器机制

    Servlet过滤器被用来拦截用户请求来进行请求之前或之后的处理,或者干脆重定向这个请求,这取决于servlet过滤器的功能. Servlet过滤器处理之后的目标servlet是 MVC 分发web ...

  5. MyBatis6:MyBatis集成Spring事物管理(下篇)

    前言 前一篇文章<MyBatis5:MyBatis集成Spring事物管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事物的做法,本文的目的是在这个的基 ...

  6. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  7. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  8. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  9. 事务管理(下) 配置spring事务管理的几种方式(声明式事务)

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

随机推荐

  1. 对bookinfo.dat的说明

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2008.08.03 现在论坛推出的下载工具五花八门,但是有不少都忽视了bookinfo.dat的生成,因此有必要说明一下这个 ...

  2. VMWare虚拟机无法打开内核设备"\\.\Global\vmx86"的解决方法

    cmd执行: 1.net start vmci 2.net start vmx86 3.net start VMnetuserif

  3. gRPC官方文档(安全认证)

    文章来自gRPC 官方文档中文版 认证 gRPC 被设计成可以利用插件的形式支持多种授权机制.本文档对多种支持的授权机制提供了一个概览,并且用例子来论述对应API,最后就其扩展性作了讨论. 马上将会推 ...

  4. Bit(位) and Byte(字节) ASCll 编码【基础】

    Bit(位) 与Byte(字节)的区别bit意为“位”,是计算机运算的基础,与数据处理速度和传输速度有关.比如:USB2.0标准接口传输速率为480Mbps,其中bps=bits per second ...

  5. uoj#453. 【集训队作业2018】围绕着我们的圆环(线性代数+递推)

    题面 传送门 题解 我对线代一无所知 如果下面有啥说错的地方请说出来省的我一辈子都搞不明白 如果你没看懂以下在讲什么不要紧,因为我也没看懂 首先,关于\(A\times B \equiv C \pmo ...

  6. sql开发技巧总结-2

    ---恢复内容开始--- 1.如何进行行列转换 需求: 列转换成行 select a.`user_name`,sum(b.kills) from user1 a join user_kills b o ...

  7. P1556 幸福的路

    题意:平面内有N头牛$N\le 10$john从(0,0)出发,最后回到(0,0) 只有走到牛那里john才可以改变方向,否则沿着直线走 问john经过每一头牛并且在每一头牛出恰好改变方向一次的方案( ...

  8. Leetcode 520. Detect Capital 发现大写词 (字符串)

    Leetcode 520. Detect Capital 发现大写词 (字符串) 题目描述 已知一个单词,你需要给出它是否为"大写词" 我们定义的"大写词"有下 ...

  9. C语言文件I/O和标准I/O函数

    读取/写入  相对于文件而言 输入/输出 相对于程序/内存而言 一切皆文件,键盘.显示屏也是文件,只不过是特殊的标准文件: 标准文件:标准输入.标准输出.标准错误:---->对应的文件指针:st ...

  10. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_值类型的装箱和拆箱(二)

    [注意]:如果知道自己写的代码会造成编译器反复对一个值类型进行装箱,请改成用手动方式对值类型进行装箱. [好处]:代码会变得更小.更快. [例子]: using System; public seal ...