spring security引发的若干思考

两个项目中都使用了spring security安全框架,很多资料都是介绍spring security具体使用。今天我如果还是写这些东西就显得多余了,那么我从不同的角度来总结自己对这个框架的一些认识。

首先看看两个疑惑,然后我会逐步解释这两个疑惑。

第一个疑惑,spring security框架是spring的子框架,我就非常好奇spring security和spring是如何融合起来,确切的说,spring security定义的对象如何纳入spring ioc 容器中管理。研究到最后其实都是spring自身的一些知识,比如:自定义扩展xml schema,spring ioc启动。

第二个疑惑,spring security如何拦截用户的请求。这部分可以解读spring security源码可以得到答案。

彻底搞明白第一个疑惑之后,也许你以后自己写一个框架,就可以很方便的整合到spring中去了。对于框架开发工程师来说,开发新的框架之后能整合spring是必须的事情了,毕竟spring给我们所带来的好处是可想而知的。这也是我要彻底了解清楚原理的动力所在。废话一堆,进入主题吧~~~~

第一个疑惑最后涉及到两个方面的知识,spring ioc启动和spring可扩展xml schema。spring ioc有两个非常重要的概念,beanfactory和applicationContext,后者提供了更多更强的功能。为了避免过多的细节直接解读beanfactory的读取过程,xmlbeanfactory读取xml文件会经历如下两个过程:1、通过resource接口读取xml文件,转换成document。 2、从document中解析出bean的配置。具体详细过程请参照文章:spring读取xml配置源代码分析(这篇文章一定要先看懂,不然后面很难继续)。看过我介绍大家看的那篇文章之后,其实也有所了解spring扩展xml schema机制了。如果还不是很清楚再结合这篇文章:基于Spring可扩展Schema提供自定义配置支持。感觉有点东拼西凑的,呵呵,主要怕以后自己忘记了,所以才写篇blog。

第二个疑惑我们就看源代码吧。
<filter-mapping>
   
<filter-name>jcaptchaFilter</filter-name>
   
<url-pattern>/j_spring_security_check</url-pattern>
</filter-mapping>
    
<filter>
   
<filter-name>springSecurityFilterChain</filter-name>
   
<filter-class>com.busyCity.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
   
<filter-name>springSecurityFilterChain</filter-name>
   
<url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>  
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
web.xml中配置了DelegatingFilterProxyDelegatingFilterProxy调用FilterChainProxy的doFilter
      public void doFilter(ServletRequest request, ServletResponse response)throws IOException, ServletException
      {
          
if(currentPosition == additionalFilters.size())
           {
                
if(FilterChainProxy.logger.isDebugEnabled())
                    FilterChainProxy.logger.debug((
new StringBuilder()).append(fi.getRequestUrl()).append(" reached end of additional filter chain; proceeding with original chain").toString());
                fi.getChain().doFilter(request, response);
            } 
else
            {
                currentPosition
++;
                Filter nextFilter 
= (Filter)additionalFilters.get(currentPosition - 1);
                
if(FilterChainProxy.logger.isDebugEnabled())
                    FilterChainProxy.logger.debug((
new StringBuilder()).append(fi.getRequestUrl()).append(" at position ").append(currentPosition).append(" of ").append(additionalFilters.size()).append(" in additional filter chain; firing Filter: '").append(nextFilter).append("'").toString());
                nextFilter.doFilter(request, response, 
this);
            }
        }
这个方法就是循环调用我们用http命名空间配置的那些过滤器。然后根据不同的过滤器处理不同的内容。


我描述的都很简单,主要原因是做个记录,以后忘记了可以根据这个思路重新找到答案。不需要重新开始研究。呵呵。

posted on 2010-10-08 16:05 yangpingyu 阅读(732) 评论(0)  编辑  收藏 所属分类: java框架编程


只有注册用户登录后才能发表评论。


网站导航:
 
<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿

随笔分类

随笔档案

收藏夹

linux

产品交互

分析,设计,架构

安全

技术牛人

数据库

搜索

最新评论

阅读排行榜

评论排行榜