氟塑料離心泵www.buybeng.com

          jquery教程http://www.software8.co/wzjs/jquery/

          解決errorpage里面取不到Authentication的問題

           項目中遇到一個很奇怪的問題,在錯誤頁面404里面取不到當(dāng)前登錄用戶,即 SecurityContextHolder.getContext().getAuthentication()取不到當(dāng)前的登陸用戶信息。這個問題花了我很長時間最終搞定了,下面講一下解決問題的過程。
                    首先來看一下項目的異常處理方式,在web.xml里面配置了錯誤頁:
          Xml代碼:
          1.<error-page>
          2.        <error-code>404</error-code>
          3.        <location>/WEB-INF/pages/errors/404.jsp</location>
          4.    </error-page>
                     當(dāng)訪問一個不存在的url時,spring的前端控制器的邏輯如下:
                  其實就是會調(diào)用noHandlerFound函數(shù),然后直接退出DispatcherServlet。
                  我們再來一下noHandlerFound的邏輯:

                   在這個里面實際上是返回一個404的錯誤,真正的錯誤頁面處理的轉(zhuǎn)向是由tomcat容器來完成的。通過調(diào)試發(fā)現(xiàn)在這個地方SecurityContextHolder.getContext().getAuthentication()還有值,但是訪問404頁面的tag里面就取不到了,后來通過監(jiān)控網(wǎng)絡(luò)發(fā)現(xiàn),訪問errorpage是由容器重新發(fā)起的一個請求,這個請求里面拿不到Authentication可能是沒有走springsecurity的前端攔截器 springSecurityFilterChain。
                   我們來看一下springSecurityFilterChain filter的配置:
          Xml代碼:

          1.<filter>
          2.        <filter-name>springSecurityFilterChain</filter-name>
          3.        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
          4.    </filter>
          5.    <filter-mapping>
          6.        <filter-name>springSecurityFilterChain</filter-name>
          7.        <url-pattern>/*</url-pattern>
          8.    </filter-mapping>

                   突然想到極有可能是這個filter沒有轉(zhuǎn)發(fā),后來看了下filter-mapping的配置,還真是這樣。filter-mapping里面接受dispatcher參數(shù)。
                   我們就來看一下這個參數(shù)的含義。
           
                    2.4版本的servlet規(guī)范在部屬描述符中新增加了一個<dispatcher>元素,這個元素有四個可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一個<filter-mapping>元素中加入任意數(shù)目的<dispatcher>,使得filter將會作用于直接從客戶端過來的request,通過forward過來的request,通過include過來的request和通過<error-page>過來的request。如果沒有指定任何< dispatcher >元素,默認(rèn)值是REQUEST。
                      可以通過下面幾個例子來輔助理解。
          Xml代碼:

          1. <filter-mapping> 
          2. <filter-name>Logging Filter</filter-name> 
          3. <url-pattern>/products/*</url-pattern> 
          4. </filter-mapping>

                     這種情況下,過濾器將會作用于直接從客戶端發(fā)過來的以/products/…開始的請求。因為這里沒有制定任何的< dispatcher >元素,默認(rèn)值是REQUEST。
          Xml代碼:

          1. <filter-mapping> 
          2. <filter-name>Logging Filter</filter-name> 
          3. <servlet-name>ProductServlet</servlet-name> 
          4. <dispatcher>INCLUDE</dispatcher> 
          5. </filter-mapping> 

                  這種情況下,如果請求是通過request dispatcher的include方法傳遞過來的對ProductServlet的請求,則要經(jīng)過這個過濾器的過濾。其它的諸如從客戶端直接過來的對ProductServlet的請求等都不需要經(jīng)過這個過濾器。
                  指定filter的匹配方式有兩種方法:直接指定url-pattern和指定servlet,后者相當(dāng)于把指定的servlet對應(yīng)的url-pattern作為filter的匹配模式
          filter的路徑匹配和servlet是一樣的,都遵循servlet規(guī)范中《SRV.11.2 Specification of Mappings》一節(jié)的說明
           
          Xml代碼:

          1. <filter-mapping> 
          2. <filter-name>Logging Filter</filter-name> 
          3. <url-pattern>/products/*</url-pattern> 
          4. <dispatcher>FORWARD</dispatcher> 
          5. <dispatcher>REQUEST</dispatcher> 
          6. </filter-mapping> 

                   看了這個,我修改了下springSecurityFilterChain的filter-mapping的配置,就     好了。
                    修改后的配置如下:
          Xml代碼:
           

          1. <filter>
          2.         <filter-name>springSecurityFilterChain</filter-name>
          3.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
          4.     </filter>
          5.     <filter-mapping>
          6.         <filter-name>springSecurityFilterChain</filter-name>
          7.         <url-pattern>/*</url-pattern>
          8.         <dispatcher>REQUEST</dispatcher>
          9.         <dispatcher>ERROR</dispatcher>
          10.     </filter-mapping>

                   意思就是直接從客戶端過來的request和通過<error-page>過來的request 都要走這個filter,配置完后就果斷好了。
                   好了,就寫到這里了,希望對大家有所幫助。關(guān)于springSecurityFilterChain這個我會另寫一篇博客進(jìn)行詳細(xì)講解。
          本人原創(chuàng),發(fā)現(xiàn)一些網(wǎng)站無道德的抓取,請自覺刪去內(nèi)容,轉(zhuǎn)載請注明出處:http://www.software8.co/wzjs/java/2797.html

          posted on 2013-01-23 18:00 你爸是李剛 閱讀(1689) 評論(1)  編輯  收藏

          評論

          # re: 解決errorpage里面取不到Authentication的問題 2013-01-24 14:04 勤奮的asialee

          oftware8太惡心了,我的原創(chuàng)被弄成了他的原創(chuàng),請大家到iteye來看我的原創(chuàng)吧,還有一些其他比較精彩的博文,謝謝大家支持:
          http://asialee.iteye.com/blog/1772860  回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           
          <2013年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          技術(shù)網(wǎng)站

          行業(yè)網(wǎng)站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          站長網(wǎng) 氟塑料離心泵 注塑機(jī) 液晶廣告機(jī)
          主站蜘蛛池模板: 灵武市| 江孜县| 丽江市| 临城县| 太保市| 仪陇县| 稷山县| 屯昌县| 临夏县| 包头市| 南乐县| 八宿县| 日喀则市| 凤山市| 宜黄县| 荣昌县| 江陵县| 全椒县| 河西区| 江孜县| 临沂市| 尚义县| 江安县| 巴中市| 安达市| 五家渠市| 阳江市| 土默特左旗| 岫岩| 凌云县| 玉树县| 阿勒泰市| 航空| 虎林市| 当涂县| 乐昌市| 会理县| 辰溪县| 栾川县| 茌平县| 肥西县|