﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心有多大，舞台就有多大-随笔分类-java框架编程</title><link>http://www.blogjava.net/yangpingyu/category/46557.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 08 Oct 2010 10:27:22 GMT</lastBuildDate><pubDate>Fri, 08 Oct 2010 10:27:22 GMT</pubDate><ttl>60</ttl><item><title>spring security引发的若干思考</title><link>http://www.blogjava.net/yangpingyu/archive/2010/10/08/333980.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Fri, 08 Oct 2010 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/yangpingyu/archive/2010/10/08/333980.html</guid><wfw:comment>http://www.blogjava.net/yangpingyu/comments/333980.html</wfw:comment><comments>http://www.blogjava.net/yangpingyu/archive/2010/10/08/333980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangpingyu/comments/commentRss/333980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangpingyu/services/trackbacks/333980.html</trackback:ping><description><![CDATA[两个项目中都使用了spring security安全框架，很多资料都是介绍spring security具体使用。今天我如果还是写这些东西就显得多余了，那么我从不同的角度来总结自己对这个框架的一些认识。<br />
<br />
首先看看两个疑惑，然后我会逐步解释这两个疑惑。<br />
<br />
第一个疑惑，spring security框架是spring的子框架，我就非常好奇spring security和spring是如何融合起来，确切的说，spring security定义的对象如何纳入spring ioc 容器中管理。研究到最后其实都是spring自身的一些知识，比如：自定义扩展xml schema，spring ioc启动。<br />
<br />
第二个疑惑，spring security如何拦截用户的请求。这部分可以解读spring security源码可以得到答案。<br />
<br />
彻底搞明白第一个疑惑之后，也许你以后自己写一个框架，就可以很方便的整合到spring中去了。对于框架开发工程师来说，开发新的框架之后能整合spring是必须的事情了，毕竟spring给我们所带来的好处是可想而知的。这也是我要彻底了解清楚原理的动力所在。废话一堆，进入主题吧~~~~<img src="/CuteSoft_Client/CuteEditor/images/emsmilep.gif" alt="" align="absmiddle" border="0" /><br />
<br />
第一个疑惑最后涉及到两个方面的知识，spring ioc启动和spring可扩展xml schema。spring ioc有两个非常重要的概念，beanfactory和applicationContext，后者提供了更多更强的功能。为了避免过多的细节直接解读beanfactory的读取过程，xmlbeanfactory读取xml文件会经历如下两个过程：1、通过resource接口读取xml文件，转换成document。 2、从document中解析出bean的配置。具体详细过程请参照文章：<a title="spring读取xml配置源代码分析" href="http://kimilv.javaeye.com/blog/547103">spring读取xml配置源代码分析</a>（这篇文章一定要先看懂，不然后面很难继续）。看过我介绍大家看的那篇文章之后，其实也有所了解spring扩展xml schema机制了。如果还不是很清楚再结合这篇文章：<a title="基于Spring可扩展Schema提供自定义配置支持 " href="http://blog.csdn.net/cutesource/archive/2010/09/05/5864562.aspx">基于Spring可扩展Schema提供自定义配置支持</a>。感觉有点东拼西凑的，呵呵，主要怕以后自己忘记了，所以才写篇blog。<br />
<br />
第二个疑惑我们就看源代码吧。<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">mapping</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">jcaptchaFilter</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">url</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">pattern</span><span style="color: rgb(0, 0, 0);">&gt;/</span><span style="color: rgb(0, 0, 0);">j_spring_security_check</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">url</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">pattern</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">mapping</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">springSecurityFilterChain</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">com.busyCity.web.filter.DelegatingFilterProxy</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">mapping</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">springSecurityFilterChain</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">filter</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">name</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">url</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">pattern</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;<br />
&lt;/filter-mapping&gt;</span></div>
web.xml中配置了<span style="color: rgb(0, 0, 0);">DelegatingFilterProxy</span><span style="color: rgb(0, 0, 0);">，</span><span style="color: rgb(0, 0, 0);">DelegatingFilterProxy</span><span style="color: rgb(0, 0, 0);">调用</span>FilterChainProxy的doFilter<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><span style="color: rgb(0, 0, 255);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response)</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;IOException,&nbsp;ServletException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(currentPosition&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;additionalFilters.size())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(FilterChainProxy.logger.isDebugEnabled())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChainProxy.logger.debug((</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;StringBuilder()).append(fi.getRequestUrl()).append(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;reached&nbsp;end&nbsp;of&nbsp;additional&nbsp;filter&nbsp;chain;&nbsp;proceeding&nbsp;with&nbsp;original&nbsp;chain</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi.getChain().doFilter(request,&nbsp;response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentPosition</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Filter&nbsp;nextFilter&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(Filter)additionalFilters.get(currentPosition&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(FilterChainProxy.logger.isDebugEnabled())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChainProxy.logger.debug((</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;StringBuilder()).append(fi.getRequestUrl()).append(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;at&nbsp;position&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).append(currentPosition).append(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;of&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).append(additionalFilters.size()).append(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;in&nbsp;additional&nbsp;filter&nbsp;chain;&nbsp;firing&nbsp;Filter:&nbsp;'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).append(nextFilter).append(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextFilter.doFilter(request,&nbsp;response,&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
这个方法就是循环调用我们用http命名空间配置的那些过滤器。然后根据不同的过滤器处理不同的内容。<br />
<br />
<br />
我描述的都很简单，主要原因是做个记录，以后忘记了可以根据这个思路重新找到答案。不需要重新开始研究。呵呵。<br />
<img src ="http://www.blogjava.net/yangpingyu/aggbug/333980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangpingyu/" target="_blank">yangpingyu</a> 2010-10-08 16:05 <a href="http://www.blogjava.net/yangpingyu/archive/2010/10/08/333980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>