1. 程式人生 > >Session機制、持久化、session="false"屬性不建立session、顯示建立session及其銷燬

Session機制、持久化、session="false"屬性不建立session、顯示建立session及其銷燬

session機制
當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識 - 稱為session id,如果已包含一個session id則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存。
儲存這個session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發揮給伺服器。一般這個cookie的名字都是類似於SEEESIONID,而。比如weblogic對於web應用程式生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。

這裡寫圖片描述

我們通過一個例子來理解下:
session.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
>
<title>Insert title here</title> </head> <body> <%=session.getId()%> </body> </html>

我們捕獲下請求頭、請求體
看第一次訪問的請求標頭,是沒有攜帶cookie的
這裡寫圖片描述

看第一次訪問的相應標頭,包含了一個Set-Cookie(name為JSESSIONID)
這裡寫圖片描述

看第二次訪問的請求標頭,是攜帶Cookie的(name為JSESSIONID)
這裡寫圖片描述

看第二次訪問的相應標頭:
這裡寫圖片描述

持久化session-cookie


Session cookie 系統會創造一個名為JsessionId輸出cookie,這就是通常說的session cookie,
我們知道在瀏覽器設定不禁用cookie,cookie不持久化的情況下,退出瀏覽器cookie消失,
因為預設情況下,cookie是一個會話級別的cookie,儲存在瀏覽器的核心中,使用者退出瀏覽器後被刪除,若希望瀏覽器將該cookie儲存在磁碟上,則需要使用maxAge,單位為秒
那麼session會有什麼不同嘛?我麼做一個例子來理解下

session.jsp持久化時間為90秒

<body>
     <%
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        cookie.setMaxAge(90);
        response.addCookie(cookie);
     %>
</body>

看第一次訪問的請求標頭,是沒有攜帶cookie的
這裡寫圖片描述
看第一次訪問的相應標頭,包含了一個Set-Cookie(name為JSESSIONID)
這裡寫圖片描述

關閉瀏覽器,在90秒內,完成第二次訪問!!!!
看第二次訪問的請求標頭,是攜帶Cookie的(name為JSESSIONID)
這裡寫圖片描述
看第二次訪問的相應標頭:
這裡寫圖片描述

這個例子就簡單說明了下session的持久化,關掉瀏覽器重新開啟輸入網頁,一樣可以得到同一個session,並不是關閉了瀏覽器就銷燬了session

session=”false”屬性,不建立session的情況
1.若當前jsp是客戶端訪問當前web應用的第一個資源,且jsp的page指定的session屬性值為false,則伺服器就不會為jsp建立一個session物件
session.jsp 設定為session=”false”

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
     <%=request.getSession(false)%>
</body>
</html>

對於Servlet而言
一個常見的誤解是以為session在有客戶端訪問時就被建立,然而事實是,如果servlet是客戶端訪問的第一個web應用資源,則只有呼叫了request.getSession()或者request.getSession(true)才會建立session對像,request.getSession(false)如果沒有和當前頁面關聯的session物件也返回null,有則返回true,一句話無session物件返回null,有則true,request.getSession(true)如果沒有關聯的返回一個新建立的session,如有直接返回關聯的session

在這種情況下,瀏覽器輸出為null
這裡寫圖片描述
這裡寫圖片描述

2.若當前jsp不是客戶端訪問當前web應用的第一個資源,而其他頁面已經建立了一個session,則當前頁面會返回一個跟當前會話關聯的session物件,而不會為當前jsp頁面新建session物件的(比如超連結帶過來的)
我們寫2個簡單的jsp
toSession.jsp只有一個超連結,跳轉到session.jsp

<a href="session.jsp">tosession.jsp</a>

session.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
     <%=request.getSession(false)%>
</body>
</html>

以下是截圖:
這裡寫圖片描述
這裡寫圖片描述

在session.jsp中,也可以獲取到toSession.jsp帶來的session
這裡寫圖片描述

toSession.jsp和session.jsp是同用了一個session

則JSP檔案在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session物件的來歷,但如果頁面顯示的設定Session=false;是當前頁面禁用session隱含的變數,但可以顯示的定義其他session變數

request.getSession(true)顯示建立session、以及Session的銷燬,

1.Session.invalidate();
超出session的過期時間
2.session.setMaxInactiveInterval(); 單位為妙

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

3.解除安裝web應用

我們通過一個例子看下如何銷燬session
session.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%
    //建立一個session物件
        HttpSession session = request.getSession(true);
    out.print(session.getId());

    out.print("<br>");
    out.print(session.getMaxInactiveInterval());
    session.setMaxInactiveInterval(5);
    out.print("<br>");
    out.print(session.getMaxInactiveInterval());
    %>

</body>
</html>

這裡寫圖片描述

session預設是半小時-1800秒(這種通過request.getSession(true);建立的session)
5秒之後在請求,可以看出session值變化了,重建session
這裡寫圖片描述

相關推薦

Session機制持久化session="false"屬性建立session顯示建立session及其銷燬

session機制 當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識 - 稱為session id,如果已包含一個session id則說明以前已經為此客戶端建立過session,伺服

巧用session機制實現使用者重複登入記錄使用者登入日誌統計線上人數

HttpSessionBindingListener 這個具體的使用文件自查,本篇中是新建了一個類實現本介面 public class UsersOnlineCountListener implements HttpSessionBindingListe

淺析http協議cookies和session機制瀏覽器快取

最近幾天在複習http協議中headers,cookies、session、快取等相關知識,發現些新知識點。 這篇文章注重結合PHP去理解這些內容,也就是比較注重實踐部分。 一、            http headers           NO1:對於web應用,

Redis的刪除機制持久化 主從

Redis的使用分兩點: 效能如下圖所示,我們在碰到需要執行耗時特別久,且結果不頻繁變動的SQL,就特別適合將執行結果放入快取。這樣,後面的請求就去快取中讀取,使得請求能夠迅速響應。   併發在大併發的情況下,所有的請求直接訪問資料庫,資料庫會出現連線異常。這個時候,就需要使用redis做一個

學習PHP遇到的session能刪除清空的問題,手賤啊手賤

超級鬱悶的問題,原來是我手賤了 關於刪除 session: 關於刪除 cookie: 寫一個登入介面的時候,成功登入後登出出來,嘗試了很多程式碼都沒能成功清空 結果仔細觀察才發現當時是這樣

asp.net類檔案中無法使用SessionResponse(當前上下文中存在名稱“Session”)

一些物件或是方法,如Session, Response,Server等等,無法在類別中直接打,是因為沒有在類別中引用它們的名稱空間。這個名稱空間(namespace):System.Web。另外它們正確的寫為HttpContext.Current.Session,Http

Redis入門到精通7-Redis主從輔助哨兵機制持久化機制

七、Redis主從複製、哨兵、持久化機制 1.主從複製,讀寫分離 ​ 1、Master可以擁有多個Slave; ​ 2、多個salve可以連線同一個Master,還可以連結到其他的slave ​ 3、主從複製不會阻塞Master,在同步資料時,master可以繼續處理c

理解Session快取機制 操縱持久化物件

Hibernate向我們提供的主要的操縱資料庫的介面,Session就是其中的一個,它提供了基本的增,刪,改,查方法.而且具有一個快取機制,能夠按照某個時間點,按照快取中的持久化物件屬性的變化來更新資料庫,著就是Session的快取清理過程.在Hibernate中物件分為三個

分布式緩存技術redis學習系列(三)——redis高級應用(主從事務與鎖持久化

master ica not ood www working can 出了 owin 上文《詳細講解redis數據結構(內存模型)以及常用命令》介紹了redis的數據類型以及常用命令,本文我們來學習下redis的一些高級特性。 回到頂部 安全性設置 設置客戶端操作秘密

Head First Servlets and JSP】筆記9:屬性的作用域線程安全

string details attr target 部分 ring 瀏覽器 什麽是 作用 什麽是屬性? 屬性和參數 屬性的3個作用域 屬性API 屬性不好的一面 1、到底什麽是屬性(Attribute)? 屬性就是一個對象,可以被設置(bound,也可以

hibernate載入持久化對象的兩種方式——getload

總結 font 存在 con null 同學 分析 保存 找到 一.get與load對照 在hibernate中get和load方法是依據id取得持久化對象的兩種方法。但在實際使用的過程中總會把兩者混淆,不知道什麽情況下使用get好,什麽時候使用lo

MySQL無法創建外鍵查詢外鍵的屬性

日誌 sam 方便 orm column 發的 針對 str 邏輯 MySQL存儲引擎--MyISAM與InnoDB區別 - 上善若水,水善利萬物而不爭。 - CSDN博客 http://blog.csdn.net/xifeijian/article/details/20

php session機制與cookie機制以及聯系與區別

標識 級別 聯系 是什麽 生命周期 技術 路徑 多次 瀏覽器中 session與cookie是在做項目中很常用的會話技術,session與cookie也是面試中被問到頻率最高的問題,有一次我去面試,面試官就懟著我session與cookie一直問(頭都大了),下面總結了一些

Cookie/Session機制詳解

order 隱藏對象 tro 這就是 緩存 cat 時域 共享 創建 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務器端記錄

各主流瀏覽器(PC移動端)userAgent屬性信息

ble 信息 ie 8 瀏覽器版本 實用 link row inux oppo PC: IE、QQ、chrome、firefox、360、safair 移動端:微信內置瀏覽器、QQ、獵豹、百度、UC、2345、系統自帶 PC:   ie:       Mozilla/5

模仿J2EE的session機制的App後端會話信息管理

序列化 相關 || redis 字節 param div 模仿 remove 此文章只將思想,不提供具體完整實現(博主太懶,懶得整理),有疑問或想了解的可以私信或評論 背景   在傳統的java web 中小型項目中,一般使用session暫存會話信息,比如登錄者的身份信息

利用屬性中設置查看DataContext Command等

size pos log mage command 12c ack contex src DataContext 1 2 3 示例 1 2 xaml代碼自動生成

Linux命令應用大詞典-第 15章 文件目錄權限和屬性

pos pan span 所有 -c get hat 5.4 屬性 15.1 chmod:更改文件和目錄的模式 15.2 chown:更改文件和目錄的用戶所有者和組群所有者 15.3 chgrp:更改文件或目錄的所屬組 15.4 umask:顯示和設置文件及目錄創建默認權

Shell腳本的邏輯判斷if文件目錄屬性判斷if的特殊用法Shell中的case判斷

Linux學習筆記Shell腳本的邏輯判斷 if文件目錄屬性判斷 if的特殊用法 Shenll中的case判斷 Shell腳本的邏輯判斷、if文件目錄屬性判斷、if的特殊用法、Shell中的case判斷