zhangsenwei

          張森煒的博客

          聯系 管理
            19 Posts :: 8 Stories :: 55 Comments :: 0 Trackbacks
          這次我們來看一下session的使用,那么我們就通過一個統計網站在線用戶這個例子來開始我們今天的話題吧。

              我們上次說了當一個客戶端第一次訪問網站時,服務器就會為這個客戶端創建一個session,那么我們可以在某一時刻通過session的存活數量知道當前有多少客戶端在線,那么問題是我們怎么才能知道某一時間內有多少個session存活呢?我們可以自己寫一個累加器幫我們完成,當一個新的客戶端訪問服務器時就要創建一個新的session這是當我們session被創建時我們將計數器加1,反之如果一個session長時間沒有用超出了設置的超時時間session就會被銷毀,我們就在它銷毀的時候將計數器減1,這樣我們就可以知道當前有多少人在線了。其實我們可以通過上面的這個例子看出我們在對session的創建和銷毀進行監聽,沒錯,這個例子正是session的監聽器。那么我們來看一下代碼如何寫。

          首先我們創建一個主頁 index.jsp

           

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

          <html>

            
          <head>

               
          <title>Session監聽</title>

             
          </head> 

            
          <body>

              
          <FORM name="form" method="GET" action="success.jsp">

                      
          <P>       Name:    

                       
          <INPUT type="text" name="name">  

                      
          </P>

                      
          <P>

                            password:
          <INPUT type="password" name="pwd">

                      
          </P>

                      
          <P>                           

                          
          <INPUT type="Reset" name="button2" value="重置"> 

                           
          <INPUT type="Submit" name="button1" value="提交" />

                      
          </P>

          </FORM> 

          </body>

          </html>

                  上面這個index.jsp 頁面的作用是讓我們點擊提交按鈕后進入 success.jsp 頁面中,而在success.jsp中可以看到當前在線人數的數量,當然要在這里注意一點的是當我們訪問index.jsp時服務器端的session就已經被創建了,而不是當我們點擊完提交按鈕后才創建的。也就是說當我們已打開index.jsp頁面時我們的計數器就已經加1了,而點擊提交按鈕只是將我們的計數器中的值取出來。

          我們再去創建一個包,包的名字叫:listener

          我們再在listener包中創建一個類,名字是:SessionLis

          SessionLis源碼如下:

           

          package listener;

          import javax.servlet.ServletContext;

          import javax.servlet.http.HttpSessionEvent;

          import javax.servlet.http.HttpSessionListener;

          public class SessionLis implements HttpSessionListener{

              
          //累加器累計在線人數

                 
          static int num=0;

              
          //當session創建時,調用此方法

                 
          public void sessionCreated(HttpSessionEvent arg0) {

                        
          /*

                         * 獲取Servlet上下文對象,上下文對象是全局

                         * 的類似于Application的功能

                         
          */


                        ServletContext application 
          = arg0.getSession().getServletContext();

                        
          /*

                         * 應為此方法只有創建session時才會被調用,

                         * 程序執行到此表示有一個新的session對象

                         * 產生了,所以要將累計器加 1

                         
          */


                        
          ++num;

                        
          /*

                         *將累加器更新后的數據存放到上下文中

                         
          */


                        application.setAttribute(
          "num",num+"");

                        
          /*

                         *為session設置超時時間

                         *但這里需要注意即使超時時間到了session對象不一定

                         *會被銷毀,應為什么時候銷毀不是由我們人為決定的

                         *是由容器Tomcat所決定的。

                         
          */
                   

                        arg0.getSession().setMaxInactiveInterval(
          100);         

                 }


                  
          //當session銷毀時調用此方法

                 
          public void sessionDestroyed(HttpSessionEvent arg0) {

                        System.out.println(
          "bbb");

                        
          /*

                         * 獲取Servlet上下文對象,上下文對象是全局

                         * 的類似于Application的功能

                         
          */


               ServletContext application 
          = arg0.getSession().getServletContext();

                        
          /*

                         * 應為此方法只有銷毀session時才會被調用,

                         * 程序執行到此表示有一個session對象被

                         * 銷毀了,所以要將累計器減 1

                         
          */


                        
          --num;

                        
          /*

                         * 將累加器更新后的數據存放到上下文中

                         
          */


                        application.setAttribute(
          "num",num+"");

                 }


          }


           

              上面這個類的作用,上看過以后基本都清楚了主要使用來監聽session的創建與銷毀的,有人又會問老師,那么是不是我隨便寫一個類讓它實現HttpSessionListener接口就可以直接對session進行監聽了,當然不是。既然我們要監聽我們就要通知Tomcat容器讓它知道呀所以我們還需要在web.xml中進行注冊一下這樣我們的Tomcat容器就知道了。我們打開web.xml文件修改代碼:

           

          <?xml version="1.0" encoding="UTF-8"?>

          <web-app version="2.4"

              xmlns
          ="http://java.sun.com/xml/ns/j2ee"

              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"

              xsi:schemaLocation
          ="http://java.sun.com/xml/ns/j2ee

              http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
          >

           
          <listener>

                 
          <listener-class>

                      listener.SessionLis

                 
          </listener-class >

           
          </listener >

          </web-app>

          下面我們創建剛才在index.jsp中提到過的 success.jsp頁面。

          success.jsp源碼:

           

           

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

          <html>

              
          <head>

                  
          <title>My JSP 'success.jsp' starting page</title>

                  
          <script type="text/javascript">

             
          function aa()

             
          {

                 frm1.action
          ="destroy.jsp";

                 frm1.submit();

              }


          </script>

              
          </head>

           

              
          <body>

                  
          <%=application.getAttribute("num")%>

                  
          <p>

                  
          <FORM name="frm1" method="GET">

                      
          <P>

                          
          <INPUT type="Button" onclick="aa()" name="button4" value="下線">

                      
          </P>

                  
          </FORM>

                  
          </P>

                  
          <P></P>

              
          </body>

          </html>

           

              上面這段代碼中出現了一段javascrit代碼里面有一個function名字叫 aa 這段代碼的功能是當用戶點擊下線按鈕時,調用這段腳本,將本頁面的請求提交到destroy.jsp頁面,這個頁面是用來銷毀session 。在上面的代碼中還出現了

          <%=application.getAttribute("num")%>  因為我們在監聽器類中將計數器存放到了application中我們要顯示存放內容只有從application中將其num的值取出。有些同學又問了問什么你不將計數器的值存放到session中而存放到application我們一起來想一下,我們要顯示的在線人數是讓所用用戶看的而session只是針對于一個客戶端的,如果我們用session保存,我們就不能夠讓所用用戶看見,只有application中的值是整個web應用程序的,所以我們將其值保存到了application中。

          下面我們再來創建一個destroy.jsp頁面用來銷毀session。

          destroy.jsp源代碼:

           

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

          <P>

           您現在已下線! 
          </P><P> </P>

           
          <%session.invalidate(); %>

              上面的代碼中<%session.invalidate(); %>表示我們讓當前session銷毀。

          有些同學又會問,老師不是session有自己的過期時間嗎?為什么還要我們去調用方法讓它銷毀呢?我們大家都去過126、163 新浪、雅虎的信箱,當我們登陸進去以后都會發現有一個按鈕“安全退出”為什么呢,其實我們上面已經說了在監聽器SessionLis類中我在session的創建方法中的最后一句代碼上面寫了一句注釋:

          /*

                         *為session設置超時時間

                         *但這里需要注意即使超時時間到了session對象不一定

                         *會被銷毀,應為什么時候銷毀不是由我們人為決定的

                         *是由容器Tomcat所決定的。

                         */         

              我們假設一下如果張三在網吧上網進入了自己的信箱,但是剛上了3分鐘就去新浪網了,有過了5分鐘張三走了,沒有關閉瀏覽器,這時由于張三登陸的session沒有銷毀所以后來的李四就可以用剛才張三打開的瀏覽器后退而不需密碼的進入張三的信箱。而服務器有沒有辦法檢測到張三什么時候離開的,張三離開了而服務器端的session過期時間沒有到session沒有銷毀,即使時間到了session也不會馬上銷毀還要有容器決定,這樣就會很不安全,所以設置了一個安全退出,而這個方法可以馬上可以讓當前的session銷毀掉,以保障當前用戶的信息安全。這也就是為什么各個信箱設置“安全退出”的原因了。

              好了,在session的使用中有個很常用的方法  session.setAttribut(key,valueObject)當我們想為當前用戶設置或保存某種狀態時用這個方法。在這句代碼中兩個參數,因為我們可以為當前session 中存放多個值,而我們如何取值呢?我怎么知道取得是不是我想要的值呢?所以就用一個key鍵來進行標示,一個key對應的一個值,比如我現在向當前session中存放了3個值:

           

            session.setAttribut(“1”,”123”);

            session.setAttribut(“age”, 
          new Integer(24));

            session.setAttribut(“qhit”,”山西太原清華IT學習認證中心”);

           

              如果我現在想取出值為“山西太原清華IT學習認證中心”的內容,如何來取呢?我們可以通過 session.getAttribut(“qhit”);  來獲取鍵為qhit所對應的值“山西太原清華IT學習認證中心”。

          好了,通過這個例子,相信大家應該對session的應用和它的作用域有一定的了解,如果還有什么不清楚的可以留言。(session的介紹結

          posted on 2008-06-21 08:47 張森煒 閱讀(740) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 监利县| 彭州市| 临夏市| 汽车| 大化| 应城市| 客服| 平江县| 吴忠市| 金秀| 忻城县| 临泽县| 西吉县| 察隅县| 华亭县| 金秀| 曲松县| 思南县| 陆丰市| 湘潭县| 枣庄市| 武川县| 怀安县| 康马县| 萍乡市| 巩留县| 邵东县| 马公市| 高要市| 长海县| 宜兰县| 德清县| 紫阳县| 通化市| 凭祥市| 陇南市| 鄂温| 彰化市| 布尔津县| 金湖县| 龙游县|