16_session&cookie

會話技術簡介
  • session和cookie都是會話技術
  • 瀏覽購物網站,在沒有登陸的情況下把商品放入購物車(沒登陸,不存數據庫),然后搜索其他商品放入購物車,我們會訪問多個不同的網頁,但是我們所放入購物車的商品卻一直都存放著,即使跳轉了N個不同的頁面后(數據存放在域對象中session(存放在服務端),cookie(存放在客戶端))
會話技術
  • 從打開客戶端訪問某個站點,到關閉這個瀏覽器的整個過程稱為一次會話
  • 會話技術是記錄本次會話中客戶端的狀態與數據
  • 會話技術分為Cookie和Session
  • Cookie:數據存儲在客戶端本地,減少服務器端的存儲的壓力,安全性不好,客戶端可以清除cookie
  • Session:將數據存儲到服務器端,安全性相對好,增加服務器的壓力
cookie
  • Cookie技術是將用戶的數據存儲到客戶端的技術
    • 服務器怎么把cookie寫給客戶端
    • 服務器怎么獲取客戶端攜帶的cookie
  • response把cookie信息放在響應頭(set-cookie)中返回給客戶端
服務端向客戶端發送一個cookie
  • cookie通過響應頭發送給客戶端(Set-Cookie)
    • 為什么不寫在響應體中的原因:響應體放的是客戶端顯示的內容
  • 創建cookie
Cookie cookie = new Cookie(String name, String value);//cookie不支持中文
//cookie以響應頭的形式發送給客戶端
response.addCookie(cookie); 
  • cookie默認存儲的時間為一個會話的長度(默認cookie是會話級別的,存放在內存中)
為cookie設置持久化時間
  • cookie.setMaxAge(int seconds); ---時間秒
  • 如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉cookie信息銷毀(會話級別的cookie)
  • 如果設置持久化時間,cookie信息會 被持久化到瀏覽器的磁盤文件里,過期瀏覽器 自動刪除該cookie信息
cookie.setMaxAge(int second)\\從會話級別的cookie轉為持久級別的cookie
設置Cookie的攜帶路徑
  • 如果不設置攜帶路徑,那么該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息
  • 如果設置了攜帶路徑,就只會在訪問指定的路徑中才會攜帶此cookie
  • cookie.setPath():
//1、創建cookie對象
Cookie cookie = new Cookie("name","zhangsan");
//1.1 為cookie設置持久化時間 ---- cookie信息在硬盤上保存的時間
cookie.setMaxAge(10*60);//10分鐘 ---- 時間設置為0代表刪除該cookie
//1.2 為cookie設置攜帶的路徑
//cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時才攜帶這個cookie
cookie.setPath("/WEB16");//訪問WEB16下的任何資源時都攜帶這個cookie
//cookie.setPath("/");//訪問服務器下的所有的資源都攜帶這個cookie 
//2、將cookie中存儲的信息發送到客戶端---頭
response.addCookie(cookie);
刪除客戶端的cookie
  • 如果想刪除客戶端的已經存儲的cookie信息,那么就使用同名同路徑的持久化時間為0的cookie進行覆蓋即可
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設置成與要刪除cookie的path一致
cookie.setPath("/WEB16");
//設置時間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
服務器獲取客戶端發送的cookie
  • cookie信息是以請求頭的方式發送到服務器端的
  • 通過request獲得所有的Cookie
Cookie[] cookies = request.getCookies();
  • 遍歷Cookie數組,通過Cookie的名稱獲得我們想要的Cookie
//獲得客戶端攜帶的cookie的數據
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獲取用戶上次登陸的時間
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

String lastTime = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if (cookie.getName().equalsIgnoreCase("lastAccessTime")) {
            lastTime = cookie.getValue();
        }
    }
}
if (lastTime == null) {
    response.getWriter().write("歡迎登陸");
}else {
    response.getWriter().write("歡迎登陸,你上次登陸時間為: " + lastTime);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(new Date());
Cookie cookie = new Cookie("lastAccessTime", format);
cookie.setMaxAge(60 * 10);//10分鐘
response.addCookie(cookie);
session
  • Session技術是將數據存儲在服務器端的技術,會為每個客戶端都創建一塊內存空間存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬于自己的內存空間
  • 服務端開辟了存放session的內存,并把編號發給客戶端,客戶端存取數據時把session編號帶過去
  • session技術是基于cookie的--存儲session編號(JSESSONID)
  • 發送編號到服務器,根據編號去尋找session的位置是服務器與客戶端自動完成的,不需要自己手動編寫代碼(session比cookie更容易,就一個api)
  • session是一個域對象
  • 公司給你配了個保險柜放資料,你可以上下班帶回家(cookie),但是不安全,容易被人偷或者丟失.也可以放公司的保險柜里(session),但是你需要把鑰匙(sessionId)帶回家.
創建/獲取Session對象
  • 獲得專屬于當前會話的Session對象,如果服務器端沒有該會話的Session對象會創建一個新的Session返回
  • 如果已經有了屬于該會話的Session直接將已有 的Session返回
  • 實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在session了
//創建屬于該客戶端的session對象,如果存在,則獲取
HttpSession session = request.getSession();
向session中存取數據
  • session也是一個域對象
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
Session面試題
  • 你網session存放的數據沒了,是什么原因:
    • 瀏覽器請掉cookie緩存了(JSESSIONID沒有了)
    • session過期/失效了
  • Session的生命周期(面試題或者筆試題,問的非常多)
    • 創建:第一次執行request.getSession()的時候創建

    • 銷毀:

      1. 服務器關閉
      2. session過期/失效(默認30分鐘),時間的起算點:從不操作服務端資源開始時(web.xml)
      <session-config>
          <session-timeout>30</session-timeout>
      </session-config>
      
      1. 手動銷毀session.invalidate()
  • 瀏覽器關閉了Session就銷毀了嗎
    • 不是
JSESSONID持久化
  • 默認JSESSONID的cookie是會話級別的,把它設置成持久化級別的
  • 手動創建一個存儲JSESSONID的cookie,為cookie設置持久化時間
//創建屬于該客戶端(會話)的私有的session區域
/* request.getSession()方法內部會判斷 該客戶端是否在服務器端已經存在session
 * 如果該客戶端在此服務器不存在session 那么就會創建一個新的session對象
 * 如果該客戶端在此服務器已經存在session 獲得已經存在的該session返回
 */
HttpSession session = request.getSession();

session.setAttribute("name", "jerry");

String id = session.getId();//該session對象的編號id

//手動創建一個存儲JSESSIONID的Cookie 為該cookie設置持久化時間
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB16/");
cookie.setMaxAge(60*10);

response.addCookie(cookie);

response.getWriter().write("JSESSIONID:"+id);
驗證碼校驗功能
  • web工程中讀取 文件,必須使用絕對磁盤路徑
  • String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容