文档章节

Spring DelegatingFilterProxy 源码分析

叶易
 叶易
发布于 2016/08/08 18:36
字数 584
阅读 1134
收藏 18

在web项目,利用Spirng 管理权限框架时,不管权限框架使用的是Shiro还是SpringSecucrity在web.xml文件中都有一个名org.springframework.web.filter.DelegatingFilterProxy 的Filter。 配置如下:

<filter>
		<filter-name>securityFilter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
</filter>

DelegatingFilterProxy 是Spring web内部一个类,其实现了GenericFilterBean,而GenericFilterBean又实现了javax.servlet.Filter接口,并对Filter#init方法进行了重写,而Filter#doFilter交给其子类去实现。而GenericFilterBean#init方法内部调用了GenericFilterBean#initFilterBean方法。该方法的默认实现为空,其采用了模板方法的设计模式交给其子类去实现initFilterBean的具体逻辑。

public final void init(FilterConfig filterConfig) throws ServletException {
	        ...此处省略部分代码
		// Let subclasses do whatever initialization they like
		initFilterBean();
		...此处省略部分代码
}

现在,来看看DelegatingFilterProxy#initFilterBean的现实代码

@Override
	protected void initFilterBean() throws ServletException {
		synchronized (this.delegateMonitor) {
			if (this.delegate == null) {
				// If no target bean name specified, use filter name.
				if (this.targetBeanName == null) {
					this.targetBeanName = getFilterName();
				}
				// Fetch Spring root application context and initialize the delegate early,
				// if possible. If the root application context will be started after this
				// filter proxy, we'll have to resort to lazy initialization.
				WebApplicationContext wac = findWebApplicationContext();
				if (wac != null) {
					this.delegate = initDelegate(wac);
				}
			}
		}
	}

该方法中有两处关键的地方this.targetBeanName = getFilterName()与WebApplicationContext wac = findWebApplicationContext()。前者得到web.xml中filter对应的名字,将其赋予为targetBeanName;后者 得到一个WebApplicationContex对象,这个接口大家应该很熟悉其续承了ApplicationContext,而通过其#getBean方法我们便可以得到在spring-context.xml配置文件中安全框架的具体实现。 先来看看 initDelegate对应的代码:

protected Filter initDelegate(WebApplicationContext wac) throws ServletException {
		Filter delegate = wac.getBean(getTargetBeanName(), Filter.class);
		if (isTargetFilterLifecycle()) {
			delegate.init(getFilterConfig());
		}
		return delegate;
}

Filter delegate = wac.getBean(getTargetBeanName(), Filter.class),便是利用我们在web.xml配置文件设置的<filter-name>securityFilter</filter-name>去spring-context.xml配置文件中找到安全框架的具体实现类。 所以,在spring-context.xml文件中org.apache.shiro.spring.web.ShiroFilterFactoryBean对应的id一定要与web.xml中的filter-name一致。而对于SpringSecurity有点不同,默认情况在web.xml中DelegatingFilterProxy的filter-name为springSecurityFilterChain,可以在配置文件中使用<alias name="filterChainProxy" alias="securityFilter"/> 指定web.xml 中DelegatingFilterProxy对应的名称。

欢迎查看我的另一篇文章 ** Shiro源码分析之ShiroFilterFactoryBean ** http://my.oschina.net/u/1421030/blog/731610

本文转载自:

共有 人打赏支持
叶易
粉丝 22
博文 24
码字总数 30959
作品 0
无锡
私信 提问
shiro登录流程

ShiroFilter Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制,ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端 其是安全控制的...

嘿嘿!!
2016/10/20
0
0
DelegatingFilterProxy的原理及运用

DelegatingFilterProxy的原理及使用 DelegatingFilterProxy就是一个对于servlet filter的代理,用这个类的好处主要是通过Spring容器来管理servlet filter的生命周期,还有就是如果filter中需...

随智阔
2014/04/02
0
0
Spring Security3源码分析-FilterChainProxy初始化

很久没有更新博客了,最近对Spring Security做了比较深入的研究。 spring security的教程网上很多: http://lengyun3566.iteye.com/category/153689 http://wenku.baidu.com/view/b0c0dc0b7...

Dead_knight
2014/01/20
0
2
【转载】spring-session负载均衡原理分析

注明转载:https://www.jianshu.com/p/beaf18704c3c 第一部分:我会用循序渐进的方式来展示源码,从大家最熟悉的地方入手,而不是直接从系统启动来debug源码。直接debug源码看到后来大家都会...

zhu_kai1
11/24
0
0
关于使用springframework.security的问题

今天想试试spring提供的security,于是下载了jar包进行配置: spring-security-config-4.1.3.RELEASE spring-security-core-4.1.3.RELEASE spring-security-web-4.1.3.RELEASE 跟着教程走,通......

XuePeng77
2016/09/26
267
3

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
31分钟前
2
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
56分钟前
6
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
6
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
5
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部