Session 詳解
一、Session簡單介紹
在WEB開發中,服務器可以為每個用戶瀏覽器創建一個會話對象(session對象),註意:一個瀏覽器獨占一個session對象(默認情況下)。因此,在需要保存用戶數據時,服務器程序可以把用戶數據寫到用戶瀏覽器獨占的session中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數據,為用戶服務。
1.存儲需要在整個用戶會話過程中保持其狀態的信息,例如登錄信息或用戶瀏覽 Web應用程序時需要的其它信息。 2.存儲只需要在頁面重新加載過程中或按功能分組的一組頁之間保持其狀態的對象。 3.Session 的作用就是它在 Web服務器上保持用戶的狀態信息供在任何時間從任何設備上的頁面進行訪問。因為瀏覽器不需要存儲任何這種信息,所以可以使用任何瀏覽器,即使是像 Pad 或手機這樣的瀏覽器設備。二、Session和Cookie的主要區別
- Cookie是把用戶的數據寫給用戶的瀏覽器。
- Session技術把用戶的數據寫到用戶獨占的session中。
- Session對象由服務器創建,開發人員可以調用request對象的getSession方法得到session對象。
- cookie數據存放在客戶的瀏覽器上,session數據放在服務器上
- cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
三、session實現原理
服務器是如何實現一個session為一個用戶瀏覽器服務的?
服務器創建session出來後,會把session的id號,以cookie的形式回寫給客戶機,這樣,只要客戶機的瀏覽器不關,再去訪問服務器時,都會帶著session的id號去,服務器發現客戶機瀏覽器帶session id過來了,就會使用內存中與之對應的session為之服務。可以用如下的代碼證明:
package xdp.gacl.session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF=8");
response.setContentType("text/html;charset=UTF-8");
//使用request對象的getSession()方法獲取session,如果session不存在則創建一個
HttpSession session = request.getSession();
//將數據存儲到session中
session.setAttribute("data", "大花貓");
//獲取session的Id
String sessionId = session.getId();
//判斷session是不是新創建的
if (session.isNew()) {
response.getWriter().print("session創建成功,session的id是:"+sessionId);
}else {
response.getWriter().print("服務器已經存在該session了,session的id是:"+sessionId);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
結果可以自己試一下自己體會
session對象的一些常用方法:
1、public void setAttribute(String name,String value)設定指定名字的屬性的值,並將它添加到session會話範圍內,如果這個屬性是會話範圍內存在,則更改該屬性的值。
/*
setAttribute("給這個變量取的名字,以後通過這個名字getAttribute,比如hello",變量);
getAttribute("hello")就得到變量了
變量可以是任意的類型,比如String,int,或自己定義的類對象,所以get的時候就涉及到類型轉換的問題了
這時強轉一下就行了,如果set的時候放的是String類型的變量,則String s=(String)session.getAttribute("hello");
*/
2、public Object getAttribute(String name)在會話範圍內獲取指定名字的屬性的值,返回值類型為object,如果該屬性不存在,則返回null。
3、public void removeAttribute(String name),刪除指定名字的session屬性,若該屬性不存在,則出現異常。
4、public void invalidate(),使session失效。可以立即使當前會話失效,原來會話中存儲的所有對象都不能再被訪問。
5、public String getId( ),獲取當前的會話ID。每個會話在服務器端都存在一個唯一的標示sessionID,session對象發送到瀏覽器的唯一數據就是sessionID,它一般存儲在cookie中。
6、public void setMaxInactiveInterval(int interval) 設置會話的最大持續時間,單位是秒,負數表明會話永不失效。
7. public int getMaxInActiveInterval(),獲取會話的最大持續時間,使用時候需要一些處理
Session 詳解