1.會話入門java
2.cookie瀏覽器
3.session緩存
4.自定義緩存安全
5.自定義Token服務器
6.表單重複提交(Http重複提交)cookie
1.二、軟件中的會話網絡
打開瀏覽器 -> 瀏覽商品列表 -> 加入購物車(把商品信息保存下來) -> 關閉瀏覽器session
打開瀏覽器-> 直接進入購物車 -> 查看到上次加入購物車的商品 -> 下訂單 -> 支付dom
在購物會話過程當中,如何保存商品信息暱?分佈式
會話管理:管理瀏覽器客戶端和服務器端之間會話過程當中產生的會話數據。
域對象: 實現資源之間的數據共享。
request域對象:必定要使用轉發技術來跳轉頁面
context域對象:context是全部用戶公有的資源會覆蓋數據
解決辦法: 可使用session域對象來保存會話數據
1.三、會話技術
Cookie技術:會話數據保存在瀏覽器客戶端。
Session技術:會話數據保存在服務器端。
2.一、cookie特色:會話數據保存在瀏覽器客戶端。
2.二、cookie技術核心
cookie類:用於存儲會話數據
1)構造Cookie對象
new Cookie(java.lang.Stringname, java.lang.String value)
2)設置cookie
void setPath(java.lang.String uri) :設置cookie的有效訪問路徑
void setMaxAge(int expiry) : 設置cookie的有效時間
void setValue(java.lang.String newValue) :設置cookie的值
3)發送cookie到瀏覽器端保存
void response.addCookie(Cookie cookie) : 發送cookie
4)服務器接收cookie
Cookie[] cookies =request.getCookies() : 接收cookie
2.3:cookie原理
1)服務器建立cookie對象,把會話數據存儲到cookie對象中。
new Cookie("name","value");
2) 服務器發送cookie信息到瀏覽器
response.addCookie(cookie);
舉例: set-cookie:name=eric (隱藏發送了一個set-cookie名稱的響應頭)
3)瀏覽器獲得服務器發送的cookie,而後保存在瀏覽器端。
4)瀏覽器在下次訪問服務器時,會帶着cookie信息
舉例: cookie: name=eric (隱藏帶着一個叫cookie名稱的請求頭)
5)服務器接收到瀏覽器帶來的cookie信息
request.getCookies();
2.4:cookie的細節
1)void setPath(java.lang.String uri) :設置cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑保存在哪裏,那麼瀏 覽器在有效路徑下訪問服務器時就會帶着cookie信息,不然不帶cookie信息。
2)void setMaxAge(int expiry) : 設置cookie的有效時間。
正整數:表示cookie數據保存瀏覽器的緩存目錄(硬盤中),數值表示保存的時間。
負整數:表示cookie數據保存瀏覽器的內存中。瀏覽器關閉cookie就丟失了!!
零:表示刪除同名的cookie數據
3)Cookie數據類型只能保存非中文字符串類型的。能夠保存多個cookie,可是瀏覽器通常只容許存放300個Cookie,每一個站點 最多存放20個Cookie,每一個Cookie的大小限制爲4KB。
2.五、案例-顯示用戶上次訪問時間
3.一、使用session的優點
通過上面瞭解到cookie的侷限
1)Cookie只能存字符串類型。不能保存對象
2)只能存非中文。
3)1個Cookie的容量不超過4KB。
若是用想存非字符串、超過4kb內容 那就得用咱們接下的主角 session啦。session的特色:會話存在服務器內存中
3.二、session核心
HttpSession類:用於保存會話數據
1)建立或獲得session對象
HttpSession getSession()
HttpSession getSession(booleancreate)
2)設置session對象
void setMaxInactiveInterval(intinterval) :設置session的有效時間
void invalidate() :銷燬session對象
java.lang.String getId() :獲得session編號
3)保存會話數據到session對象
void setAttribute(java.lang.Stringname, java.lang.Object value) :保存數據
java.lang.ObjectgetAttribute(java.lang.String name) :獲取數據
voidremoveAttribute(java.lang.String name) :清除數據
3.三、session原理
1)第一次訪問建立session對象,給session對象分配一個惟一的ID,叫JSESSIONID
newHttpSession();
2)把JSESSIONID做爲Cookie的值發送給瀏覽器保存
Cookiecookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)第二次訪問的時候,瀏覽器帶着JSESSIONID的cookie訪問服務器
4)服務器獲得JSESSIONID,在服務器的內存中搜索是否存放對應編號的session對象。
if(找到){
returnmap.get(sessionID);
}
Map<String,HttpSession>]
<"s001",s1>
<"s001,"s2>
5)若是找到對應編號的session對象,直接返回該對象
6)若是找不到對應編號的session對象,建立新的session對象,繼續走1的流程
結論:經過JSESSION的cookie值在服務器找session對象!!!!!
3.四、session細節
1)java.lang.String getId() :獲得session編號
2)兩個getSession方法:getSession(true)/ getSession() : 建立或獲得session對象。沒有匹配的session編號自動建立新的 session對象。
getSession(false): 獲得session對象。沒有匹配的session編號,返回null
3)void setMaxInactiveInterval(int interval) : 設置session的有效時間
session對象銷燬時間:
3.1默認狀況30分服務器自動回收
3.2修改session回收時間
3.3全局修改session有效時間
案例 建立和獲取session
建立session
注意 當你瀏覽器關閉session Id會被清空掉
session的實現原理 服務端返回sessionId給客戶端保存 客戶端經過本地SessionId請求 查找服務器保存的sessionId
5.一、什麼是token ?
token是一個令牌,具備隨機性,相似於sessionId。在對接一些第三方平臺的時候,爲了可以保證數據安全性,一般會使用一些令牌進行交互
5.二、 如何自定義token
token生成規則,只要保證token生成一個不重複的惟一字符串便可,使用jdk自帶的uuid生成規則。
5.三、什麼是uuid
UUID含義是通用惟一識別碼 (Universally Unique Identifier),這是一個軟件建構的標準,也是被開源軟件基金會 (Open Software Foundation, OSF) 的組織應用在分佈式計算環境 (Distributed ComputingEnvironment, DCE) 領域的一部分。
UUID 的目的,是讓分佈式系統中的全部元素,都能有惟一的辨識資訊,而不須要透過中央控制端來作辨識資訊的指定。如此一來,每一個人均可以創建不與其它人衝突的 UUID。
5.四、使用UUDID生成Token
String tokenId=UUID.randomUUID().toString();
6.1、產生表單重複提交的緣由:網絡延遲、從新刷新、點擊網頁回退到以前頁面繼續提交
6.2、解決方式
1)使用JavaScript
缺點:用戶從新刷新仍是會出現重複提交
2)、使用服務器提交解決
具體的作法:在服務器端生成一個惟一的隨機標識號,專業術語稱爲Token(令牌),同時在當前用戶的Session域中保存這個Token。而後將Token發送到客戶端的Form表單中,在Form表單中使用隱藏域來存儲這個Token,表單提交的時候連同這個Token一塊兒提交到服務器端,而後在服務器端判斷客戶端提交上來的Token與服務器端生成的Token是否一致,若是不一致,那就是重複提交了,此時服務器端就能夠不處理重複提交的表單。若是相同則處理表單提交,處理完後清除當前用戶的Session域中存儲的標識號。
轉發代碼