16_session&cookie

會話技術簡介
  • session和cookie都是會話技術
  • 瀏覽購物網站,在沒有登陸的情況下把商品放入購物車(沒登陸,不存數據庫),然后搜索其他商品放入購物車,我們會訪問多個不同的網頁,但是我們所放入購物車的商品卻一直都存放著,即使跳轉了N個不同的頁面后(數據存放在域對象中session(存放在服務端),cookie(存放在客戶端))
會話技術
  • 從打開客戶端訪問某個站點,到關閉這個瀏覽器的整個過程稱為一次會話
  • 會話技術是記錄本次會話中客戶端的狀態(tài)與數據
  • 會話技術分為Cookie和Session
  • Cookie:數據存儲在客戶端本地,減少服務器端的存儲的壓力,安全性不好,客戶端可以清除cookie
  • Session:將數據存儲到服務器端,安全性相對好,增加服務器的壓力
cookie
  • Cookie技術是將用戶的數據存儲到客戶端的技術
    • 服務器怎么把cookie寫給客戶端
    • 服務器怎么獲取客戶端攜帶的cookie
  • response把cookie信息放在響應頭(set-cookie)中返回給客戶端
服務端向客戶端發(fā)送一個cookie
  • cookie通過響應頭發(fā)送給客戶端(Set-Cookie)
    • 為什么不寫在響應體中的原因:響應體放的是客戶端顯示的內容
  • 創(chuàng)建cookie
Cookie cookie = new Cookie(String name, String value);//cookie不支持中文
//cookie以響應頭的形式發(fā)送給客戶端
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、創(chuàng)建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中存儲的信息發(fā)送到客戶端---頭
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);
服務器獲取客戶端發(fā)送的cookie
  • cookie信息是以請求頭的方式發(fā)送到服務器端的
  • 通過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技術是將數據存儲在服務器端的技術,會為每個客戶端都創(chuàng)建一塊內存空間存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬于自己的內存空間
  • 服務端開辟了存放session的內存,并把編號發(fā)給客戶端,客戶端存取數據時把session編號帶過去
  • session技術是基于cookie的--存儲session編號(JSESSONID)
  • 發(fā)送編號到服務器,根據編號去尋找session的位置是服務器與客戶端自動完成的,不需要自己手動編寫代碼(session比cookie更容易,就一個api)
  • session是一個域對象
  • 公司給你配了個保險柜放資料,你可以上下班帶回家(cookie),但是不安全,容易被人偷或者丟失.也可以放公司的保險柜里(session),但是你需要把鑰匙(sessionId)帶回家.
創(chuàng)建/獲取Session對象
  • 獲得專屬于當前會話的Session對象,如果服務器端沒有該會話的Session對象會創(chuàng)建一個新的Session返回
  • 如果已經有了屬于該會話的Session直接將已有 的Session返回
  • 實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在session了
//創(chuàng)建屬于該客戶端的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的生命周期(面試題或者筆試題,問的非常多)
    • 創(chuàng)建:第一次執(zhí)行request.getSession()的時候創(chuàng)建

    • 銷毀:

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

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

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

//手動創(chuàng)建一個存儲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閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萎河,死亡現場離奇詭異,居然都是意外死亡蕉饼,警方通過查閱死者的電腦和手機虐杯,發(fā)現死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昧港,“玉大人擎椰,你說我怎么就攤上這事】” “怎么了确憨?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓤的。 經常有香客問我休弃,道長,這世上最難降的妖魔是什么圈膏? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任塔猾,我火速辦了婚禮,結果婚禮上稽坤,老公的妹妹穿的比我還像新娘丈甸。我一直安慰自己,他們只是感情好尿褪,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布睦擂。 她就那樣靜靜地躺著,像睡著了一般杖玲。 火紅的嫁衣襯著肌膚如雪顿仇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音臼闻,去河邊找鬼鸿吆。 笑死,一個胖子當著我的面吹牛述呐,可吹牛的內容都是我干的惩淳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼乓搬,長吁一口氣:“原來是場噩夢啊……” “哼思犁!你這毒婦竟也來了?” 一聲冷哼從身側響起进肯,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抒倚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坷澡,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡含蓉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年频敛,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馅扣。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡斟赚,死狀恐怖,靈堂內的尸體忽然破棺而出差油,到底是詐尸還是另有隱情拗军,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布蓄喇,位于F島的核電站发侵,受9級特大地震影響,放射性物質發(fā)生泄漏妆偏。R本人自食惡果不足惜刃鳄,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钱骂。 院中可真熱鬧叔锐,春花似錦、人聲如沸见秽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽解取。三九已至步责,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勺择。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工创南, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人省核。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓稿辙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親气忠。 傳聞我的和親對象是個殘疾皇子邻储,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容

  • 背景在HTTP協議的定義中,采用了一種機制來記錄客戶端和服務器端交互的信息旧噪,這種機制被稱為cookie吨娜,cooki...
    時芥藍閱讀 2,355評論 1 17
  • 1. cookie 1.1 什么是cookie cookie 是存儲于訪問者的計算機中的變量。每當同一臺計算機通過...
    cbw100閱讀 4,051評論 0 13
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,222評論 0 51
  • 寫在前面 cookie和session的區(qū)別: 1淘钟、cookie數據存放在客戶的瀏覽器上宦赠,session數據放在服...
    Pitfalls閱讀 1,522評論 0 17
  • 我知道你現在不是只是因為爸媽,你還怕自己考不過米母,也在糾結即使考過了又能怎么樣勾扭,而想著,是不是就這么算了铁瞒,你就不苦了...
    李紅燁閱讀 97評論 0 0