Java Web(4)Cookie與Session

Java Web三大作用域對象:

  • HttpServletRequest
  • HttpSession
  • ServletContext

1.Session與Cookie

1.1 Session

A session is a group of user interactions with your website that take place within a given time frame.

會話是在給定時間范圍內發(fā)生的一組用戶與網(wǎng)站的互動。
在WEB開發(fā)中,服務器可以為每個用戶瀏覽器創(chuàng)建一個會話對象(session對象),注意:一個瀏覽器獨占一個session對象(默認情況下)。因此,在需要保存用戶數(shù)據(jù)時,服務器程序可以把用戶數(shù)據(jù)寫到用戶瀏覽器獨占的session中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數(shù)據(jù),為用戶服務。
Session的數(shù)據(jù)存儲在Tomcat服務器的內存中,具有時效性。

1.2 Cookie

cookie 是一個非常具體的東西,指的就是瀏覽器里面能永久存儲的一種數(shù)據(jù),僅僅是瀏覽器實現(xiàn)的一種數(shù)據(jù)存儲功能。
服務器生成cookie,發(fā)送給瀏覽器,瀏覽器把cookie以kv形式保存到某個目錄下的文本文件內,下一次請求同一網(wǎng)站時會把該cookie發(fā)送給服務器。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會占據(jù)太多磁盤空間,所以每個域的cookie數(shù)量是有限的。
有了Cookie這樣的技術實現(xiàn),服務器在接收到來自客戶端瀏覽器的請求之后,就能夠通過分析存放于請求頭的Cookie得到客戶端特有的信息,從而動態(tài)生成與該客戶端相對應的內容。

Cookie的方法

javax.servlet.http.Cookie; 描述
public void setDomain(String pattern) 設置 cookie 的域名,比如 loserwang.com
public String getDomain() 獲取 cookie 的域名,比如loserwamg.com
public void setMaxAge(int expiry) 設置 cookie 有效期,以秒為單位,默認有效期為當前session的存活時間
public int getMaxAge() 獲取 cookie 有效期,以秒為單位,默認為-1 ,表明cookie會活到瀏覽器關閉為止
public String getName() 返回 cookie 的名稱,名稱創(chuàng)建后將不能被修改
public void setValue(String newValue) 設置 cookie 的值
public String getValue() 獲取cookie的值
public void setPath(String uri) 設置 cookie 的路徑,默認為當前頁面目錄下的所有 URL,還有此目錄下的所有子目錄
public String getPath() 獲取 cookie 的路徑
public void setSecure(boolean flag) 指明 cookie 是否要加密傳輸
public void setComment(String purpose) 設置注釋描述 cookie 的目的。當瀏覽器將 cookie 展現(xiàn)給用戶時,注釋將會變得非常有用
public String getComment() 返回描述 cookie 目的的注釋,若沒有則返回 null

實現(xiàn)Cookie

//(1) 創(chuàng)建一個 Cookie 對象
Cookie cookie = new Cookie("key","value");
//(2) 設置最大生存周期
cookie.setMaxAge(60*60*24); 
//(3) 發(fā)送 Cookie 到 HTTP 響應頭
response.addCookie(cookie);

中文編碼

Servlet Cookie 處理需要對中文進行編碼與解碼,方法如下:

String   str   =   java.net.URLEncoder.encode("中文","UTF-8");            //編碼
String   str   =   java.net.URLDecoder.decode("編碼后的字符串","UTF-8");   // 解碼

1.3 Session跟蹤

Web應用程序是使用HTTP協(xié)議傳輸數(shù)據(jù)的。HTTP協(xié)議是無狀態(tài)的協(xié)議。一旦數(shù)據(jù)交換完畢,客戶端與服務器端的連接就會關閉,再次交換數(shù)據(jù)需要建立新的連接。這就意味著服務器無法從連接上跟蹤會話。即用戶A購買了一件商品放入購物車內,當再次購買商品時服務器已經(jīng)無法判斷該購買行為是屬于用戶A的會話還是用戶B的會話了。
每一個Session都有其Sessiond,瀏覽器和服務器之間通過SessionID進行跟蹤會話,有以下三種方式來維持 Web 客戶端和 Web 服務器之間的 session 會話

  • Cookie : 一個 Web 服務器可以分配一個唯一的 session 會話 ID 作為每個 Web 客戶端的 cookie,對于客戶端的后續(xù)請求可以使用接收到的 cookie 來識別。這可能不是一個有效的方法,因為很多瀏覽器不支持 cookie,所以我們建議不要使用這種方式來維持 session 會話。
  • URL 重寫 : 您可以在每個 URL 末尾追加一些額外的數(shù)據(jù)來標識 session 會話,服務器會把該 session 會話標識符與已存儲的有關 session 會話的數(shù)據(jù)相關聯(lián)。例如,http://w3cschool.cc/file.htm;sessionid=12345
  • 隱藏的表單字段 : 一個 Web 服務器可以發(fā)送一個隱藏的 HTML 表單字段,以及一個唯一的 session 會話 ID,如下所示:
<input type="hidden" name="sessionid" value="12345">

1.4 HttpSession 對象

javax.servlet.http.HttpSession ; 描述
public Object getAttribute(String name) 該方法返回在該 session 會話中具有指定名稱的對象,如果沒有指定名稱的對象,則返回 null。
public Enumeration getAttributeNames() 該方法返回 String 對象的枚舉,String 對象包含所有綁定到該 session 會話的對象的名稱。
public long getCreationTime() 該方法返回該 session 會話被創(chuàng)建的時間,自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒為單位。
public String getId() 該方法返回一個包含分配給該 session 會話的唯一標識符的字符串。
public long getLastAccessedTime() 該方法返回客戶端最后一次發(fā)送與該 session 會話相關的請求的時間自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒為單位。
public int getMaxInactiveInterval() 該方法返回 Servlet 容器在客戶端訪問時保持 session 會話打開的最大時間間隔,以秒為單位。
public void invalidate() 該方法指示該 session 會話無效,并解除綁定到它上面的任何對象。
public boolean isNew() 如果客戶端還不知道該 session 會話,或者如果客戶選擇不參入該 session 會話,則該方法返回 true。
public void removeAttribute(String name) 該方法將從該 session 會話移除指定名稱的對象。
public void setAttribute(String name, Object value) 該方法使用指定的名稱綁定一個對象到該 session 會話。
public void setMaxInactiveInterval(int interval) 該方法在 Servlet 容器指示該 session 會話無效之前,指定客戶端請求之間的時間,以秒為單位。

HttpSessiony原理:
Tomcat服務器會自動為每一個瀏覽器請求創(chuàng)建一個有SessionId的Session,然后每次以Cookie的形式將SeesionId返回瀏覽器,瀏覽器下次訪問就攜帶這個Cookie:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受請求發(fā)來的參數(shù)
       String name = req.getParameter("name");
       String password = req.getParameter("password");
        HttpSession session = req.getSession();
        session.setAttribute("name", name);
        session.setAttribute("password", password);

        resp.getWriter().println("<p>name : " + name + "</p>" );
        resp.getWriter().println("<p>password : " + password + "</p>" );
        System.out.println(session.getId());
    }

當訪問相應網(wǎng)頁后,結果如下:


瀏覽器收到Cookie.png

瀏覽器收到Cookie.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容