session相關的知識筆記。

1           cookie相關:

java中的cookie類:javax.servlet.http.Cookie類。

新建CookieCookie cookie = new Cookie(“name”,”value”)

設置:

cookie.setName(“newname”);

cookie.setValue(“newvalue”);

cookie.setMaxAge(int second):這裏塗過second設置爲負值或者不設置setMaxAge方法,代表瀏覽器關閉就刪除這個Cookie,如果設置爲0,表示通知瀏覽器立刻刪除這個Cookie

cookie.setPath(String path):設置當前cookie的有效路徑,即在哪個路徑範圍內有效。如果要設置爲當前應用有效,則path”/”

request.getCookies()獲取一個客戶端的Cookie[]數組。

response.addCookie(Cookie cookie)向客戶端添加一個Cookie

2           由於創建HttpSession對象會佔用內存,所以Web服務器一般不會在客戶端第一次打開頁面是創建session,而是在用戶第一次使用到session時創建。例如:

2.1          HttpServletRequest.getSession()方法獲取session的時候,如果session還沒有創建,就創建session後返回這個session

2.2          HttpServletRequest.getSession(boolean flag)true代表不存在時創建sessionfalse代表不創建,返回null

3.           錯誤說法:session的生命週期從創建到關閉瀏覽器。

            http協議不能識別到客戶端瀏覽器的關閉,也不會在協議中存儲關閉瀏覽器的狀態。

            即使瀏覽器已經關閉,只要session的期限還沒有到,服務器端就還是存在這個session的。同樣,即使瀏覽器還沒有關閉,但是上次session對象(不是session中存儲的值)訪問後,到現在的時間間隔已經超過了session的設置期限的話,服務器端也會刪除這個session

            tomcat中設置session的有效時間期限:

conf下的web.xml中:

<session-config>

<session-timeout>30</session-timeout>

</session-config>

時間單位是分鐘。

              在代碼中設置:

                     HttpSession.setMaxInactiveInterval(int second)

這裏的單位是秒鐘。

              獲取session上次被訪問的時間:

                     HttpSession.getLastAccessedTime()返回一個long值,代表1970年至今的時間。

4.           session持久化管理。

            持久化的對象必須實現了Serializable接口。

            tomcat中的session持久化。

如果沒有配置持久化,tomcat也會默認使用簡單的session持久化類org.apache.catalina.session.StandardManager來對實現了Serializable接口的session中存儲的對象進行持久化,這種簡單的持久化是把這些對象持久化到本地文件,存儲路徑默認爲:Catalina/honstname/applicatonname/SESSIONS.ser(默認值)文件中。也可以通過配置自定義這種持久化的參數,例如:

<Context path="/testcontext" docBase="/context">

  <Manager className="org.apache.catalina.session.StandardManager" debug="0"       maxActiveSessions="-1" checkInterval="60" />

</Context>

這裏的一個Manager元素就代表一個session持久化配置。checkInterval-檢查session是否過期的時間間隔,以秒爲單位,缺省值是60秒; maxActiveSessions-可處於活動狀態的session數。-1代表無限制。

     如果不想使用默認的持久化類,可以使用tomcat提供的更加靈活的持久化類。配置如下:

<Context path="/helloapp" docBase="helloapp" debug="0" reloadable="true">     <Manager className="org.apache.catalina.session.PersistentManager" debug="0" saveOnRestart="true"           maxActiveSessions="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" >   

 <Store className="org.apache.catalina.session.FileStore" directory="mydir"/>     </Manager> </Context>

參數說明:saveOnRestart-服務器關閉時,是否將所有的session保存到文件中; maxActiveSessions-可處於活動狀態的session數; minIdleSwap/maxIdleSwapsession處於不活動狀態最短/長時間(s)sesson對象轉移到File Store中; maxIdleBackup-超過這一時間,將session備份。(1表示沒有限制)

tomcat還提供了實現持久化Session Store的接口,org.apache.catalina.Store,目前提供了兩個具體實現類:org.apache.catalina.FileStoreorg.apache.catalina.JDBCStore。分別表示將session持久化到本地文件和數據庫中。

5.           一個session持久化的例子:

5.1 定義User

package com.mycompany.context.beans;

 

public class User {

    private String name;

    public User()

    {

      

    }

    public User(String name) {

       this.name = name;

    }

 

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

}

5.2 定義SerializableUser

package com.mycompany.context.beans;

 

import java.io.Serializable;

 

public class SerializableUser implements Serializable {

    private String name;

    public SerializableUser(String name) {

       this.name = name;

    }

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

}

5.3 定義Servlet

package com.mycompany.context.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

import com.mycompany.context.beans.SerializableUser;

import com.mycompany.context.beans.User;

 

public class SessionTest extends HttpServlet {

 

      @Override

      protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                    throws ServletException, IOException {

             resp.setHeader("Pragma", "No-cache");

             resp.setHeader("Cache-Control", "no-cache");

             resp.setDateHeader("Expires", 0);

 

             resp.setContentType("text/html;charset=UTF-8");

             PrintWriter out = resp.getWriter();

             HttpSession session = req.getSession();

             User user = (User) session.getAttribute("user");

             if (user == null) {

                    session.setAttribute("user", new User("zhang"));

                    out.println("session中加入了User對象。");

             } else {

                    out.println("User對象爲:" + user.getName());

             }

 

             SerializableUser suser = (SerializableUser) session

                           .getAttribute("suser");

             if (suser == null) {

                    session.setAttribute("suser", new SerializableUser("zhang1"));

                    out.println("session中加入了SerializableUser對象。");

             } else {

                    out.println("SerializableUser對象爲:" + suser.getName());

             }

      }

 

}

測試的過程是,首先訪問這個Servlet,顯示爲創建兩個session,然後再刷新,都是顯示兩個session的值。因爲這時候session已經初始化過了。重啓tomcat後,訪問這個Servlet,發現顯示爲:創建了User,顯示了SerializableUser。這說明SerializableUser被持久化了,但是User沒有。因爲User沒有實現Serializable接口。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章