spring security引發(fā)的若干思考

          兩個(gè)項(xiàng)目中都使用了spring security安全框架,很多資料都是介紹spring security具體使用。今天我如果還是寫這些東西就顯得多余了,那么我從不同的角度來總結(jié)自己對(duì)這個(gè)框架的一些認(rèn)識(shí)。

          首先看看兩個(gè)疑惑,然后我會(huì)逐步解釋這兩個(gè)疑惑。

          第一個(gè)疑惑,spring security框架是spring的子框架,我就非常好奇spring security和spring是如何融合起來,確切的說,spring security定義的對(duì)象如何納入spring ioc 容器中管理。研究到最后其實(shí)都是spring自身的一些知識(shí),比如:自定義擴(kuò)展xml schema,spring ioc啟動(dòng)。

          第二個(gè)疑惑,spring security如何攔截用戶的請(qǐng)求。這部分可以解讀spring security源碼可以得到答案。

          徹底搞明白第一個(gè)疑惑之后,也許你以后自己寫一個(gè)框架,就可以很方便的整合到spring中去了。對(duì)于框架開發(fā)工程師來說,開發(fā)新的框架之后能整合spring是必須的事情了,畢竟spring給我們所帶來的好處是可想而知的。這也是我要徹底了解清楚原理的動(dòng)力所在。廢話一堆,進(jìn)入主題吧~~~~

          第一個(gè)疑惑最后涉及到兩個(gè)方面的知識(shí),spring ioc啟動(dòng)和spring可擴(kuò)展xml schema。spring ioc有兩個(gè)非常重要的概念,beanfactory和applicationContext,后者提供了更多更強(qiáng)的功能。為了避免過多的細(xì)節(jié)直接解讀beanfactory的讀取過程,xmlbeanfactory讀取xml文件會(huì)經(jīng)歷如下兩個(gè)過程:1、通過resource接口讀取xml文件,轉(zhuǎn)換成document。 2、從document中解析出bean的配置。具體詳細(xì)過程請(qǐng)參照文章:spring讀取xml配置源代碼分析(這篇文章一定要先看懂,不然后面很難繼續(xù))。看過我介紹大家看的那篇文章之后,其實(shí)也有所了解spring擴(kuò)展xml schema機(jī)制了。如果還不是很清楚再結(jié)合這篇文章:基于Spring可擴(kuò)展Schema提供自定義配置支持。感覺有點(diǎn)東拼西湊的,呵呵,主要怕以后自己忘記了,所以才寫篇blog。

          第二個(gè)疑惑我們就看源代碼吧。
          <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調(diào)用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);
                      }
                  }
          這個(gè)方法就是循環(huán)調(diào)用我們用http命名空間配置的那些過濾器。然后根據(jù)不同的過濾器處理不同的內(nèi)容。


          我描述的都很簡(jiǎn)單,主要原因是做個(gè)記錄,以后忘記了可以根據(jù)這個(gè)思路重新找到答案。不需要重新開始研究。呵呵。

          posted on 2010-10-08 16:05 yangpingyu 閱讀(741) 評(píng)論(0)  編輯  收藏 所屬分類: java框架編程


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          收藏夾

          linux

          產(chǎn)品交互

          分析,設(shè)計(jì),架構(gòu)

          安全

          技術(shù)牛人

          數(shù)據(jù)庫

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 昔阳县| 庆阳市| 七台河市| 彭州市| 江都市| 宁明县| 望都县| 龙门县| 玉树县| 确山县| 古浪县| 瓦房店市| 青川县| 柏乡县| 吐鲁番市| 苏尼特左旗| 四川省| 资阳市| 平果县| 宜章县| 文成县| 南宫市| 普格县| 康定县| 滨海县| 饶阳县| 那曲县| 全州县| 安泽县| 怀化市| 宣武区| 大冶市| 浪卡子县| 陇西县| 永春县| 南阳市| 武威市| 时尚| 静海县| 满洲里市| 尉氏县|