layout: post
title: Cookie$Session
subtitle: 用法
date: 2018-04-18
author: ZL
header-img: img/20180418.jpg
catalog: true
tags:
- Cookie
- Session
會話技術(shù)
就是存儲客服端的狀態(tài)锋恬,會話技術(shù)是幫助服務(wù)器 記住客戶端狀態(tài)(區(qū)分客戶端)
從打開一個瀏覽器訪問某個站點玄坦,到關(guān)閉這個瀏覽器的整個過程,成為一次會話。
會話技術(shù)分為Cookie和Session:
Cookie:數(shù)據(jù)存儲在客戶端本地,減少服務(wù)器端的存儲的壓力,安全性不好硼控,客戶端 可以清除cookie。
Session:將數(shù)據(jù)存儲到服務(wù)器端胳赌,安全性相對好牢撼,增加服務(wù)器的壓力。
二疑苫、Cookie技術(shù)
Cookie技術(shù)是將用戶的數(shù)據(jù)存儲到客戶端的技術(shù)
服務(wù)器端向客戶端發(fā)送一個Cookie
創(chuàng)建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:
Cookie cookie = new Cookie("username"熏版,"zhangsan");
那么該cookie會以響應(yīng)頭的形式發(fā)送給客戶端:
注意:Cookie中不能存儲中文設(shè)置Cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds); ---時間秒
注意:如果不設(shè)置持久化時間,cookie會存儲在瀏覽器的內(nèi)存中捍掺,瀏覽器關(guān)閉 cookie信息銷毀(會話級別的cookie)撼短,如果設(shè)置持久化時間,cookie信息會 被持久化到瀏覽器的磁盤文件里
示例:
cookie.setMaxAge(10*60);
設(shè)置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘挺勿,過期瀏覽器 自動刪除該cookie信息設(shè)置Cookie的攜帶路徑:
cookie.setPath(String path);
注意:如果不設(shè)置攜帶路徑曲横,那么該cookie信息會在訪問產(chǎn)生該cookie的 web資源所在的路徑都攜帶cookie信息
示例:
cookie.setPath("/WEB16");
代表訪問WEB16應(yīng)用中的任何資源都攜帶cookie
cookie.setPath("/WEB16/cookieServlet");
代表訪問WEB16中的cookieServlet時才攜帶cookie信息向客戶端發(fā)送cookie:
response.addCookie(Cookie cookie);刪除客戶端的cookie:
如果想刪除客戶端的已經(jīng)存儲的cookie信息,那么就使用同名同路徑的持久化時 間為0的cookie進行覆蓋即可
服務(wù)器端怎么接受客戶端攜帶的Cookie
cookie信息是以請求頭的方式發(fā)送到服務(wù)器端的:
- 通過request獲得所有的Cookie:
Cookie[] cookies = request.getCookies(); - 遍歷Cookie數(shù)組,通過Cookie的名稱獲得我們想要的Cookie
for(Cookie cookie : cookies){ if(cookie.getName().equal(cookieName)){ String cookieValue = cookie.getValue(); } }
Session技術(shù)
Session技術(shù)是將數(shù)據(jù)存儲在服務(wù)器端的技術(shù)禾嫉,會為每個客戶端都創(chuàng)建一塊內(nèi)存空間 存儲客戶的數(shù)據(jù)灾杰,但客戶端需要每次都攜帶一個標識ID去服務(wù)器中尋找屬于自己的內(nèi) 存空間。所以說Session的實現(xiàn)是基于Cookie熙参,Session需要借助于Cookie存儲客 戶的唯一性標識JSESSIONID
獲得Session對象
HttpSession session = request.getSession();
此方法會獲得專屬于當前會話的Session對象艳吠,如果服務(wù)器端沒有該會話的Session 對象會創(chuàng)建一個新的Session返回,如果已經(jīng)有了屬于該會話的Session直接將已有 的Session返回(實質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在 session了)
向session中存取數(shù)據(jù)(session也是一個域?qū)ο螅?/h2>
Session也是存儲數(shù)據(jù)的區(qū)域?qū)ο竽跻詓ession對象也具有如下三個方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
Session對象的生命周期
創(chuàng)建:第一次執(zhí)行request.getSession()時創(chuàng)建
銷毀:
服務(wù)器(非正常)關(guān)閉時
-
session過期/失效(默認30分鐘)
問題:時間的起算點 從何時開始計算30分鐘昭娩?
從不操作服務(wù)器端的資源開始計時可以在工程的web.xml中進行配置
<session-config> <session-timeout>30</session-timeout> </session-config>
手動銷毀session
session.invalidate();
重點
Cookie技術(shù):存到客戶端
發(fā)送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒)
cookie.setPath()
response.addCookie(cookie)
獲得cookie
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();
Session技術(shù):存到服務(wù)器端 借助cookie存儲JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);
session生命周期
創(chuàng)建:第一次指定request.getSession();
銷毀:服務(wù)器關(guān)閉、session失效/過期弄屡、手動session.invalidate();
session作用范圍:默認一會話中
代碼示例
-
發(fā)出cookie
//1题禀、創(chuàng)建cookie對象 Cookie cookie = new Cookie("name","zhangsan"); //1.1 為cookie設(shè)置持久化時間 ---- cookie信息在硬盤上保存的時間 cookie.setMaxAge(10*60);//10分鐘 ---- 時間設(shè)置為0代表刪除該cookie //1.2 為cookie設(shè)置攜帶的路徑 //cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時才攜帶這個cookie cookie.setPath("/WEB16");//訪問WEB16下的任何資源時都攜帶這個cookie //cookie.setPath("/");//訪問服務(wù)器下的所有的資源都攜帶這個cookie //2、將cookie中存儲的信息發(fā)送到客戶端---頭 response.addCookie(cookie);
-
獲取cookie
//獲得客戶端攜帶的cookie的數(shù)據(jù) Cookie[] cookies = request.getCookies(); //Cookie cookie = new Cookie("name","zhangsan"); //通過cookie名稱獲得想要的cookie if(cookies!=null){ for(Cookie cookie : cookies){ //獲得cookie的名稱 String cookieName = cookie.getName(); if(cookieName.equals("name")){ //獲得該cookie的值 String cookieValue = cookie.getValue(); System.out.println(cookieValue); } } }
-
刪除cookie
//刪除客戶端保存 name=zhangsan的cookie信息 Cookie cookie = new Cookie("name",""); //將path設(shè)置成與要刪除cookie的path一致 cookie.setPath("/WEB16"); //設(shè)置時間是0 cookie.setMaxAge(0); response.addCookie(cookie);
-
設(shè)置session
//創(chuàng)建屬于該客戶端(會話)的私有的session區(qū)域 /* request.getSession()方法內(nèi)部會判斷 該客戶端是否在服務(wù)器端已經(jīng)存在session * 如果該客戶端在此服務(wù)器不存在session 那么就會創(chuàng)建一個新的session對象 * 如果該客戶端在此服務(wù)器已經(jīng)存在session 獲得已經(jīng)存在的該session返回 */ HttpSession session = request.getSession(); session.setAttribute("name", "jerry"); String id = session.getId();//該session對象的編號id
-
從session中獲取數(shù)據(jù)
//從session中獲得存儲的數(shù)據(jù) HttpSession session = request.getSession(); Object attribute = session.getAttribute("name"); response.getWriter().write(attribute+"");