1. 程式人生 > >Java Web學習總結(11)——Session使用示例教程

Java Web學習總結(11)——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("本網站有如下書:<br/>");
24         Set<Map.Entry<String,Book>> set = DB.getAll().entrySet();
25         for(Map.Entry<String,Book> me : set){
26             Book book = me.getValue();
27             String url =request.getContextPath()+ "/servlet/BuyServlet?id=" + book.getId();
28             //response. encodeURL(java.lang.String url)用於對錶單action和超連結的url地址進行重寫
29             url = response.encodeURL(url);//將超連結的url地址進行重寫
30             out.println(book.getName()  + "   <a href='"+url+"'>購買</a><br/>");
31         }
32     }
33 
34     public void doPost(HttpServletRequest request, HttpServletResponse response)
35             throws ServletException, IOException {
36         doGet(request, response);
37     }
38 }
39 
40 
41 /**
42  * @author gacl
43  * 模擬資料庫
44  */
45 class DB{
46     private static Map<String,Book> map = new LinkedHashMap<String,Book>();
47     static{
48         map.put("1", new Book("1","javaweb開發"));
49         map.put("2", new Book("2","spring開發"));
50         map.put("3", new Book("3","hibernate開發"));
51         map.put("4", new Book("4","struts開發"));
52         map.put("5", new Book("5","ajax開發"));
53     }
54     
55     public static Map<String,Book> getAll(){
56         return map;
57     }
58 }
59 
60 class Book{
61     
62     private String id;
63     private String name;
64 
65     public Book() {
66         super();
67     }
68     public Book(String id, String name) {
69         super();
70         this.id = id;
71         this.name = name;
72     }
73     public String getId() {
74         return id;
75     }
76     public void setId(String id) {
77         this.id = id;
78     }
79     public String getName() {
80         return name;
81     }
82     public void setName(String name) {
83         this.name = name;
84     }
85 }
複製程式碼

BuyServlet

複製程式碼
 1 package xdp.gacl.session;
 2 
 3 import java.io.IOException;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import javax.servlet.http.HttpSession;
11 
12 public class BuyServlet extends HttpServlet {
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response)
15             throws ServletException, IOException {
16         String id = request.getParameter("id");
17         Book book = DB.getAll().get(id);  //得到使用者想買的書
18         HttpSession session = request.getSession();
19         List<Book> list = (List) session.getAttribute("list");  //得到使用者用於儲存所有書的容器
20         if(list==null){
21             list = new ArrayList<Book>();
22             session.setAttribute("list", list);
23         }
24         list.add(book);
25         //response. encodeRedirectURL(java.lang.String url)用於對sendRedirect方法後的url地址進行重寫
26         String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet");
27         System.out.println(url);
28         response.sendRedirect(url);
29     }
30 
31     public void doPost(HttpServletRequest request, HttpServletResponse response)
32             throws ServletException, IOException {
33         doGet(request, response);
34     }
35 
36 }
複製程式碼

ListCartServlet

複製程式碼
 1 package xdp.gacl.session;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.util.List;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import javax.servlet.http.HttpSession;
11 
12 public class ListCartServlet extends HttpServlet {
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response)
15             throws ServletException, IOException {
16         response.setContentType("text/html;charset=UTF-8");
17         PrintWriter out = response.getWriter();
18         HttpSession session = request.getSession();
19         List<Book> list = (List) session.getAttribute("list");
20         if(list==null || list.size()==0){
21             out.write("對不起,您還沒有購買任何商品!!");
22             return;
23         }
24         
25         //顯示使用者買過的商品
26         out.write("您買過如下商品:<br>");
27         for(Book book : list){
28             out.write(book.getName() + "<br/>");
29         }
30     }
31 
32     public void doPost(HttpServletRequest request, HttpServletResponse response)
33             throws ServletException, IOException {
34         doGet(request, response);
35     }
36 }
複製程式碼

  在禁用了cookie的IE8下的執行效果如下:

  演示效果

  通過檢視IndexServlet生成的html程式碼可以看到,每一個超連結後面都帶上了session的Id,如下所示

複製程式碼
            
           

相關推薦

Java Web學習總結11——Session使用示例教程

一、Session簡單介紹   在WEB開發中,伺服器可以為每個使用者瀏覽器建立一個會話物件(session物件),注意:一個瀏覽器獨佔一個session物件(預設情況下)。因此,在需要儲存使用者資料時,伺服器程式可以把使用者資料寫到使用者瀏覽器獨佔的session中,

Java Web學習總結20——基於ZooKeeper的分散式session實現

1.   認識ZooKeeper ZooKeeper—— “動物園管理員”。動物園裡當然有好多的動物,遊客可以根據動物園提供的嚮導圖到不同的場館觀賞各種型別的動物,而不是像走在原始叢林裡,心驚膽顫的被動 物所觀賞。為了讓各種不同的動物呆在它們應該呆的地方,而不是相互串門

Java Web學習總結7JSP

sco runt util 註意細節 服務 private tin 多行 cnblogs 一,JSP基礎語法 1,JSP模板元素 JSP頁面中的HTML內容稱之為JSP模版元素。 JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。 2,JSP腳本

Java Web學習總結12Filter過濾器

strong xsd filter過濾器 應用程序 map .com pre one exception 一,Filter簡介 Filter也稱之為過濾器,Filter是對客戶端訪問資源的過濾,符合條件放行,不符合條件不放行,並且可以對目標資源訪問前後進行邏輯處理。

Java Web學習總結21——http協議響應狀態碼大全以及常用狀態碼

http協議響應狀態碼大全以及常用狀態碼 當我們在瀏覽網頁或是在檢視伺服器日誌時,常會遇到3位數字的狀態碼,這3位數字是什麼意思呢?其實,這3位數字是HTTP狀態碼,用來表示網頁伺服器HT

Java IO學習總結

file flush writer directory 創建 str java 資源 tab 一、File 類 Java中不管文件還是目錄都可以使用File類操作,File能新建、刪除、重命名文件和目錄,但是不能訪問文件內容本身,訪問文件內容需要使用輸入輸出流。 Fi

Tomcat學習總結11——Linux下的Tomcat安全優化

app span must 以及 站點 with rip web.xml dev 1、web.xml配置及修改: 站點默認主頁: <welcome-file-list> <welcome-file>index.html</welcome-fil

Java Web 深入分析9 Session 和 Cookie

等等 常用 log 就是 key set 協議 body 數據 前言: session 和cookie都是為了保持服務器和客戶端之間交互狀態。如果一天的PV有幾億,而一個cookie占200個字節但是也會占用很多帶寬?所以大訪問量就引用session,但是幾百臺服務器集群

Java Web開發總結 —— request接收表單提交中文參數亂碼問題

字符串 public servlet 參數 byte[] 解決 操作 get span 1、以POST方式提交表單中文參數的亂碼問題 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"

java基礎學習總結十三Java異常處理

一、JAVA異常       異常是指不期而至的各種情況,如:檔案找不到、網路連線失敗、非法引數等。異常是一個事件,它發生在程式執行期間,干擾了正常的指令流程。Java通過API中的Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是物件,是Th

java基礎學習總結:可變長度引數以及foreach迴圈原理

一、語法糖        語法糖是一種幾乎每種語言或多或少都提供過的一些方便程式設計師開發程式碼的語法,它只是編譯器實現的一些小把戲罷了,編譯期間以特定的位元組碼或者特定的方式對這些語法做一些處理,開發者就可以直接方便地使用了。這些語法糖雖然不會提供實質性

java基礎學習總結:深入理解Java泛型

一、什麼是泛型         “泛型” 意味著編寫的程式碼可以被不同型別的物件所重用。泛型的提出是為了編寫重用性更好的程式碼。泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數。 比如常見的集合類 LinkedList: publi

java基礎學習總結Java中的反射

Native      JDK開放給使用者的原始碼中隨處可見Native方法,被Native關鍵字宣告的方法說明該方法不是以Java語言實現的,而是以本地語言實現的,Java可以直接拿來用。這裡有一個概念,就是本地語言,本地語言這四個字,個人理解應該就是可以和作業系

java基礎學習總結:Cloneable介面和Object的clone()方法

為什麼要克隆 為什麼要使用克隆,這其實反映的是一個很現實的問題,假如我們有一個物件: public class SimpleObject implements Cloneable { private String str; public SimpleObject()

Java基礎學習總結135——Java程式碼效能優化實踐經驗再總結

前言 程式碼優化的最重要的作用應該是:避免未知的錯誤。在程式碼上線執行的過程中,往往會出現很多我們意想不到的錯誤,因為線上環境和開發環境是非常不同的,錯誤定位到最後往往是一個非常小的原因。然而為了解決這個錯誤,我們需要先自驗證、再打包出待替換的class檔案、暫停業務並重啟,對於一個成熟的專

Java Web學習筆記

GenertcServlet 是一個Servlet,是Servlet介面和ServletConfig介面的實現類,是一個抽象類,其中的service方法為抽象方法。 如果新建的Servlet程式直接繼承GenertcServlet會使開發更簡潔。 具體實現: 在Ge

Java Web學習筆記

ServletConfig 封裝了Servlet的配置資訊,並且可以獲取ServletContext物件 1.配置初始化引數; 2.獲取初始化引數: - getInitParameter(String name):獲取指定引數名的初始化引數 - getINitParameterN

Java Web學習筆記

HTTP(超文字傳輸協議) TCP/IP協議集中的一個應用層協議,用於定義web瀏覽器與web伺服器之間交換資料的過程以及資料本身的格式 瀏覽器與WEB伺服器的連線過程是短暫的,每次連線只處理一個請求和響應。對每一個頁面的訪問,瀏覽器與WEB伺服器都要簡歷一次單獨的連線。 瀏覽器

Java Web學習筆記

Servlet的註冊與執行: Servlet程式必須通過Servlet容器來啟動執行,並且儲存目錄有特殊要求,需要儲存在< WEB應用程式目錄 >\WEB-INF\classes\目錄中。 Servlet程式必須在WEB應用程式的web.xml檔案中進行註冊和對映其訪問路徑

Java Web學習筆記

- Java Web介紹: Java Web,是用Java技術來解決相關web網際網路領域的技術總和。web包括:web伺服器和web客戶端兩部分。JavaWeb應用由一組Servlet、HTML頁、類、以及其它可以被繫結的資源構成。 JavaWeb應用中可以包含: - Servl