acegi security實踐教程—因debug調試而產生對session疑惑

在上一篇博客中《acegi security基於form表單認證-debug調試》中講述瞭一個現象,每次重新打開新的瀏覽器,依然保留著上個頁面。針對上個例子來說,要麼是當前用戶信息、要麼是無權限信息。出現這個現象上篇博客我們已經分析過,就是securitycontext中已經存在認證過的權限對象。

那麼,我想,重新運行userinfo.jsp頁面,重新認證一遍,怎麼辦啊?唯一的辦法,stop server;open server again;不要這麼笨吧。
肯定有人會說,傻啊,運行login.jsp頁面啊。這也是一個辦法。但是遇到一個這樣的情況:這個頁面靜止不操作半天,然後刷新這個頁面時,作為程序員的你,覺得該如何處理呢?結果又該是怎樣的呢?

基於此條件下,我們給大傢介紹一下httpSessionContextIntegrationFilter,這個session過濾器開篇已經介紹過瞭,但是在兩個demo中一直沒有用到。那我們今天就在acegi配置文件中添加這個fiter,記住這個sessionfilter是在各個filter之前的,acegi配置文件中的filter是有順序要求的,想起來沒?若沒,請溫習《acegi security入門》
在form表單認證demo中,acegi配置文件中添加sessionfiter,其他一切都無需修改。

    
            
                 
                     PATTERN_TYPE_APACHE_ANT
                     /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
                 
            
     
     
       

另外再溫習一次,acegi控制流程:

目的是:再打開一個會話瀏覽器或session過期後,應該跳轉到登陸頁面。
添加sessionfitler後
測試如下:
1. 依然是運行https://localhost:8080/acegitest2/userinfo.jsp
2. 第一次運行,出現登陸頁面,使用test/1無權限用戶登陸,展示無權限頁面
3. 不關閉此瀏覽器,再打開一個瀏覽器,再次運行https://localhost:8080/acegitest2/userinfo.jsp
你的瀏覽器顯示什麼頁面呢?
是這樣?

還是這樣?

若是下圖,則說明session是一樣的。我們知道IE8中默認是session共享的。
測試工具:上圖是IE9。下圖是IE8。
4. 關閉此瀏覽器,再打開一個瀏覽器,再次運行https://localhZ喎?/kf/ware/vc/” target=”_blank” class=”keylink”>vc3Q6ODA4MC9hY2VnaXRlc3QyL3VzZXJpbmZvLmpzcAogIMTjtcTkr8DAxvfP1Mq+yrLDtNKzw+bE2KO/CiAgxOO74beiz9ZJRTi6zUlFOc/Co6y2vLvhs/bP1s2s0ru49tKzw+a8tGxvZ2luLmpzcKGjCiAgNS4gy7y/vKO/CiAg1Nm0zrP2z9bR6daks/bP1rXHwr3Ss8Pmo6zLtcP3yseyu82stcRzZXNzaW9uoaO52LHV5K/AwMb3uvOjrM6qybZJRTihojksc2Vzc2lvbr7Nw7vT0MHLxNihowogIM7Sw8fWqrXAY29va2llyse/zbuntsu05rfFtcSjrHNlc3Npb27Kx7f+zvHG986ss9a1xKOsudix1eSvwMDG96Os1rvKx87Sv827p7bLudix1aOsdG9tY2F0w7vT0M2j1rmwoaO/xNG1wLf+zvHG99aqtcDkr8DAxve52LHVo78KCgpzZXNzaW9uysfKssO0o78KICAg5K/AwMb30+u3/s7xxvfWrrzk0rvPtcHQvbu7pbav1/ezxs6q0ru49nNlc3Npb26howoKPGJyPgoKCgpzZXNzaW9utOa3xdTaxMS2+aO/CiAgIHNlc3Npb2605rfF1Nq3/s7xxvfJz6Os08m3/s7xxvfOrLPWc2Vzc2lvbqGjCgo8YnI+CgoKCnNlc3Npb27Kx8uttLS9qLXEo78KICAgc2Vzc2lvbsrH1Nq3/s7xxvfJz6OstbHIu8rHt/7O8cb3tLS9qLXEoaMKCjxicj4KCgoKc2Vzc2lvbrrOyrG0tL2otcTE2KO/ysfO0sPHt8POynVybLXY1rfKsb7NtLS9qLXEwvCjvwogICC63LbgyMu2vNLUzqrO0sPH0rvUy9DQdXJso6y+zdfUtq/J+rPJwctzZXNzaW9uoaPV4srHuty24LTtzvO1xLnbteOho7bU09q21NPa1eLW1rnbteO1xMjLo6zSsr/J0tTA7b3io6zS8s6qv6rKvM7Sw8eyu7avytbX9rvysrvJ5rywtb1zZXNzaW9u1eK/6aOsysfX1Mi7tvjIu7XEyfqzydXi1ta527Xjo6yyosfStPO24LK/t9bO0sPH08O/8rzcu/K3w87KyMu80s341b7KssO0tcSjrLa8u+HT0LzH0uS5psTcoaMKPGJyPgoKICAgyrW8ysnPc2Vzc2lvbs2ouf1qYXZhs8zQ8rS0vai1xKO6cmVxdWVzdC5nZXRTZXNzaW9uKGZsYWcpO2dldFNlc3Npb26yu8rHu/G1w7Wxx7C1xHNlc3Npb27C8KOs1PXDtLvhyse0tL2oc2Vzc2lvbsTYo7/Du9PQY3JlYXRlsKGjv8bkyrXV4srH0v66rLS0vai1xKOsztLDx73iys3Su8/C1eK49re9t6ijrNKy0O212tK7JiMzMDUyNDvT1s7zyM/OqsHLoaMKICAgcmVxdWVzdC5nZXRTZXNzaW9uKGZsYWcpO86qybbT0Lj2ss7K/cTYo7/E48a9yrG2vLT4sru0+LLOyv3E2KO/tPi78rK7tPijrNKy0O3TsM/sxOO1xLPM0PLFtqGjCiAgILWxZmxhZz1mYWxzZcqxo6xyZXF1ZXN0LmdldFNlc3Npb24oZmFsc2Up09DU8re1u9i1scewc2Vzc2lvbqOszt7U8re1u9hudWxsoaMKICAgtbFmbGFnPXRydWXKsaOscmVxdWVzdC5nZXRTZXNzaW9uKHRydWUp09DU8re1u9i1scewc2Vzc2lvbqOszt7U8rS0vajSu7j2c2Vzc2lvbqGjCiAgILb4ztLDx76ts6PKudPDtcQgcmVxdWVzdC5nZXRTZXNzaW9uKCk71eK49re9t6ijrLW9tde1yM2s0tTJz8THuPbE2KO/uf65/qOssrvQ0rXEysejrMv8tcjNrNPass7K/c6qdHJ1ZbXEt723qKGj1NrX+bXExPqjrNPQw7vT0NbQx7m1xMW2o78KICAguf65/qOsw/ew18HLsMmjrM6qybay+sn6c2Vzc2lvbsHLsMmhowo8YnI+CgogICC/z7ao09DIy9W+xvDAtLe0srWjrM7Svs3Qwr2o0ru49mhlbGxvd29ybGQuanNwo6zDu9PQyM66zmphdmGzzNDyo6xqc3DW0Lu5v8nS1Mrks/ZzZXNzaW9uxNiho9TaanNw1tA8JSBvdXQucHJpbnRsbihzZXNzaW9uLmdldElkKCkpOyU+LMTjyOe6zr3iys3V4rj2z9bP87ChLS2woS0tsKGhowogICC5/rn+o6zV4rTOxOPT1rG7w8nU2rnEwO/By6GjztLDx7a81qq1wGpzcNfuuvO2vLHg0uuzyWphdmGzzNDyo6zKtbzKyc9qc3C+zcrH0ru49nNldmxldKOsxMfDtHNlcnZsZXS/z7ao08XPyNPaanNw0rPD5qGjx9ejrMTjyKW/tL+0anNwseDS67PJamF2YbPM0PLW0NPQw7vT0MDgJiMyMDI4NDtyZXF1ZXN0LmdldFNlc3Npb24oKTvV4r7ku7ChowogICDU2nRvbWNhdF9ob21lL3dvcmsvQ2F0YWxpbmEvbG9jYWxob3N0L29yZy/E47XEz+7Evy9vcmcvYXBhY2hlL2pzcC/E42pzcMS/wrzW0M/g06a1xGphdmG6zWNsYXNzzsS8/qOss6LK1NfFtPK/qtK7z8KjrMPNyLu74beiz9ajrM7SS0FPLLu51ebT0NXivuS7sKO6c2Vzc2lvbiA9IHBhZ2VDb250ZXh0LmdldFNlc3Npb24oKTvWwdPacGFnZUNvbnRleHTO0r7Nsru94srNwLKhowogICDV4s/Cyse38dPQ0rvW1rG7xtvGrbXEuM+9xbChoaPG5Mq1yMu80r/JysfOqtTbw8e6w6GjCjxicj4KCiAgILTLyrG41bLFtcTIy9PW1b7G8MC0wcujrNTZtM7Sybvzo6y/yWpzcMm2trzDu9PQo6y+zdK7uPY8JSBvdXQucHJpbnRsbihzZXNzaW9uLmdldElkKCkpOyU+0+++5KGjCiAgIMbkyrVqc3DW0MSsyM/H6b/2u+HT0KO6PCVAcGFnZSBzZXNzaW9uPQ==”true”%>,若你jsp中顯示改成:,那麼光禿禿的jsp中session就會null啦。
這下是否有一種更被欺騙的趕腳啊。其實人傢確實為咱們好。

session何時滅呢?何時銷毀?
我們瞭解瞭session何時創建的瞭,那session何時銷毀的?就剛才acegi框架測試demo,關閉瀏覽器後,session為null,導致重新驗證,進入登陸頁面。那意思是說關閉瀏覽器,session就銷毀瞭?

既然session創建是程序來決定的,其實session銷毀,也是程序session.invalidate()來決定的。
那關閉瀏覽器,session變為null,是因為調用session.invalidate()原因嗎?這個不能顛倒順序。若關閉瀏覽器調用session.invalidate()則session變為null。而反過來則不通。為啥大部分人會感覺關閉瀏覽器,session為null,關鍵acegidemo中的session也為null呢??
那就得瞭解session的原理瞭。

    session技術原理
    當瀏覽器訪問服務器時,服務器首先判斷客戶端請求中是否包含session的標識,若存在,說明服務器已經給客戶端開辟一個session空間,然後根據此標識查找具體的session;若不存在,則服務器給客戶端新建一個session,然後把sessionId發給瀏覽器。
    其實session時利用cookie來保存sessionid,隻不過在cookie中不是sessionid,而是jsessionid。隻不過jsessionid就是sessionid的值。
    這樣的話,cookie時存在瀏覽器生命周期,當瀏覽器關閉後,cookie就沒有瞭,導致cookie中的jsessionid也就沒有瞭。因此也無法找到服務器中的session瞭,不過session在服務器中還存在,隻不過客戶端再也無法找到而已。
    所以說呢,瀏覽器關閉,看似session銷毀,是因為大部分session是基於cookie存放sessionid原理實現的.但是真正的session對象在server中沒有被銷毀,不銷毀,一直占內存?

    正式由於瀏覽器關閉,session不能真正銷毀,所以服務器端有一個session時間的機制.當服務端server檢測到某一個session距它上次活躍期超過瞭規定的時間,那麼服務器端就會調用session.invalidate()來銷毀.tomcat默認配置時間是30分鐘【tomcat6.0.37】當然這個時間可以自己修改,直接在自己項目中web.xml中進行配置即可。
    所以session銷毀的情況如下:一是調用session.invalidate();二是session回話過期;三是server停止。

    那若客戶端禁用瞭cookie呢?
    這就用到另外一個技術—URL重寫。URL重寫是在url地址後面加上jsessionid,有兩種展示方式:一種是https://localhost:8080/項目名,jsessionid=***另一種是https://localhost:8080/項目名?jsessionid=***
    那具體如何實現呢?這就用到java提供的api瞭。respone.encodeURL(“地址”)和response.encodeRedirectURL
    其中後者主要這麼使用:response.sendRedirect(response.encodeRedirectURL)重定向應用。這兩個方法可以判斷,若客戶端禁止cookie,然後就會在url地址後面添加jsessionid;若客戶端支持cookie,則就是原來的url地址。

    對於session瞭解後,下篇博客講到系統常用註銷功能時就會很簡單瞭。大傢對這塊可以嘗試自己測試下,有啥發現或見解,及時溝通交流。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *