javaWeb學習-----session

一、Session簡單介紹

  在WEB開發中,服務器可以爲每個用戶瀏覽器創建一個會話對象(session對象),注意:一個瀏覽器獨佔一個session對象(默認情況下)。因此,在需要保存用戶數據時,服務器程序可以把用戶數據寫到用戶瀏覽器獨佔的session中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數據,爲用戶服務。

二、Session和Cookie的主要區別

Cookie是把用戶的數據寫給用戶的瀏覽器。
Session技術把用戶的數據寫到用戶獨佔的session中。
Session對象由服務器創建,開發人員可以調用request對象的getSession方法得到session對象。
三、session實現原理

3.1、服務器是如何實現一個session爲一個用戶瀏覽器服務的?

  服務器創建session出來後,會把session的id號,以cookie的形式回寫給客戶機,這樣,只要客戶機的瀏覽器不關,再去訪問服務器時,都會帶着session的id號去,服務器發現客戶機瀏覽器帶session id過來了,就會使用內存中與之對應的session爲之服務。可以用如下的代碼證明:

複製代碼
1 package xdp.gacl.session;
2
3 import java.io.IOException;
4 import javax.servlet.ServletException;
5 import javax.servlet.http.HttpServlet;
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8 import javax.servlet.http.HttpSession;
9
10 public class SessionDemo1 extends HttpServlet {
11
12 public void doGet(HttpServletRequest request, HttpServletResponse response)
13 throws ServletException, IOException {
14
15 response.setCharacterEncoding(“UTF=8”);
16 response.setContentType(“text/html;charset=UTF-8”);
17 //使用request對象的getSession()獲取session,如果session不存在則創建一個
18 HttpSession session = request.getSession();
19 //將數據存儲到session中
20 session.setAttribute(“data”, “孤傲蒼狼”);
21 //獲取session的Id
22 String sessionId = session.getId();
23 //判斷session是不是新創建的
24 if (session.isNew()) {
25 response.getWriter().print(“session創建成功,session的id是:”+sessionId);
26 }else {
27 response.getWriter().print(“服務器已經存在該session了,session的id是:”+sessionId);
28 }
29 }
30
31 public void doPost(HttpServletRequest request, HttpServletResponse response)
32 throws ServletException, IOException {
33 doGet(request, response);
34 }
35 }
複製代碼
  第一次訪問時,服務器會創建一個新的sesion,並且把session的Id以cookie的形式發送給客戶端瀏覽器,如下圖所示:

  點擊刷新按鈕,再次請求服務器,此時就可以看到瀏覽器再請求服務器時,會把存儲到cookie中的session的Id一起傳遞到服務器端了,如下圖所示:

  我猜想request.getSession()方法內部新創建了Session之後一定是做了如下的處理

複製代碼
1 //獲取session的Id
2 String sessionId = session.getId();
3 //將session的Id存儲到名字爲JSESSIONID的cookie中
4 Cookie cookie = new Cookie(“JSESSIONID”, sessionId);
5 //設置cookie的有效路徑
6 cookie.setPath(request.getContextPath());
7 response.addCookie(cookie);
複製代碼
四、瀏覽器禁用Cookie後的session處理

4.1、IE8禁用cookie

  工具->internet選項->隱私->設置->將滑軸拉到最頂上(阻止所有cookies)
  

4.2、解決方案:URL重寫

  response.encodeRedirectURL(java.lang.String url) 用於對sendRedirect方法後的url地址進行重寫。
  response.encodeURL(java.lang.String url)用於對錶單action和超鏈接的url地址進行重寫

4.3、範例:禁用Cookie後servlet共享Session中的數據

IndexServlet

複製代碼
1 package xdp.gacl.session;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.util.LinkedHashMap;
6 import java.util.Map;
7 import java.util.Set;
8 import javax.servlet.ServletException;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 //首頁:列出所有書
14 public class IndexServlet extends HttpServlet {
15
16 public void doGet(HttpServletRequest request, HttpServletResponse response)
17 throws ServletException, IOException {
18
19 response.setContentType(“text/html;charset=UTF-8”);
20 PrintWriter out = response.getWriter();
21 //創建Session
22 request.getSession();
23 out.write(“本網站有如下書:
”);
24 Set

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