16_session&cookie

會(huì)話技術(shù)簡(jiǎn)介
  • session和cookie都是會(huì)話技術(shù)
  • 瀏覽購(gòu)物網(wǎng)站,在沒有登陸的情況下把商品放入購(gòu)物車(沒登陸,不存數(shù)據(jù)庫(kù)),然后搜索其他商品放入購(gòu)物車,我們會(huì)訪問多個(gè)不同的網(wǎng)頁(yè),但是我們所放入購(gòu)物車的商品卻一直都存放著,即使跳轉(zhuǎn)了N個(gè)不同的頁(yè)面后(數(shù)據(jù)存放在域?qū)ο笾衧ession(存放在服務(wù)端),cookie(存放在客戶端))
會(huì)話技術(shù)
  • 從打開客戶端訪問某個(gè)站點(diǎn),到關(guān)閉這個(gè)瀏覽器的整個(gè)過程稱為一次會(huì)話
  • 會(huì)話技術(shù)是記錄本次會(huì)話中客戶端的狀態(tài)與數(shù)據(jù)
  • 會(huì)話技術(shù)分為Cookie和Session
  • Cookie:數(shù)據(jù)存儲(chǔ)在客戶端本地,減少服務(wù)器端的存儲(chǔ)的壓力,安全性不好,客戶端可以清除cookie
  • Session:將數(shù)據(jù)存儲(chǔ)到服務(wù)器端,安全性相對(duì)好,增加服務(wù)器的壓力
cookie
  • Cookie技術(shù)是將用戶的數(shù)據(jù)存儲(chǔ)到客戶端的技術(shù)
    • 服務(wù)器怎么把cookie寫給客戶端
    • 服務(wù)器怎么獲取客戶端攜帶的cookie
  • response把cookie信息放在響應(yīng)頭(set-cookie)中返回給客戶端
服務(wù)端向客戶端發(fā)送一個(gè)cookie
  • cookie通過響應(yīng)頭發(fā)送給客戶端(Set-Cookie)
    • 為什么不寫在響應(yīng)體中的原因:響應(yīng)體放的是客戶端顯示的內(nèi)容
  • 創(chuàng)建cookie
Cookie cookie = new Cookie(String name, String value);//cookie不支持中文
//cookie以響應(yīng)頭的形式發(fā)送給客戶端
response.addCookie(cookie); 
  • cookie默認(rèn)存儲(chǔ)的時(shí)間為一個(gè)會(huì)話的長(zhǎng)度(默認(rèn)cookie是會(huì)話級(jí)別的,存放在內(nèi)存中)
為cookie設(shè)置持久化時(shí)間
  • cookie.setMaxAge(int seconds); ---時(shí)間秒
  • 如果不設(shè)置持久化時(shí)間,cookie會(huì)存儲(chǔ)在瀏覽器的內(nèi)存中,瀏覽器關(guān)閉cookie信息銷毀(會(huì)話級(jí)別的cookie)
  • 如果設(shè)置持久化時(shí)間,cookie信息會(huì) 被持久化到瀏覽器的磁盤文件里,過期瀏覽器 自動(dòng)刪除該cookie信息
cookie.setMaxAge(int second)\\從會(huì)話級(jí)別的cookie轉(zhuǎn)為持久級(jí)別的cookie
設(shè)置Cookie的攜帶路徑
  • 如果不設(shè)置攜帶路徑,那么該cookie信息會(huì)在訪問產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息
  • 如果設(shè)置了攜帶路徑,就只會(huì)在訪問指定的路徑中才會(huì)攜帶此cookie
  • cookie.setPath():
//1、創(chuàng)建cookie對(duì)象
Cookie cookie = new Cookie("name","zhangsan");
//1.1 為cookie設(shè)置持久化時(shí)間 ---- cookie信息在硬盤上保存的時(shí)間
cookie.setMaxAge(10*60);//10分鐘 ---- 時(shí)間設(shè)置為0代表刪除該cookie
//1.2 為cookie設(shè)置攜帶的路徑
//cookie.setPath("/WEB16/sendCookie");//訪問sendCookie資源時(shí)才攜帶這個(gè)cookie
cookie.setPath("/WEB16");//訪問WEB16下的任何資源時(shí)都攜帶這個(gè)cookie
//cookie.setPath("/");//訪問服務(wù)器下的所有的資源都攜帶這個(gè)cookie 
//2、將cookie中存儲(chǔ)的信息發(fā)送到客戶端---頭
response.addCookie(cookie);
刪除客戶端的cookie
  • 如果想刪除客戶端的已經(jīng)存儲(chǔ)的cookie信息,那么就使用同名同路徑的持久化時(shí)間為0的cookie進(jìn)行覆蓋即可
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設(shè)置成與要?jiǎng)h除cookie的path一致
cookie.setPath("/WEB16");
//設(shè)置時(shí)間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
服務(wù)器獲取客戶端發(fā)送的cookie
  • cookie信息是以請(qǐng)求頭的方式發(fā)送到服務(wù)器端的
  • 通過request獲得所有的Cookie
Cookie[] cookies = request.getCookies();
  • 遍歷Cookie數(shù)組,通過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獲取用戶上次登陸的時(shí)間
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("歡迎登陸,你上次登陸時(shí)間為: " + 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技術(shù)是將數(shù)據(jù)存儲(chǔ)在服務(wù)器端的技術(shù),會(huì)為每個(gè)客戶端都創(chuàng)建一塊內(nèi)存空間存儲(chǔ)客戶的數(shù)據(jù),但客戶端需要每次都攜帶一個(gè)標(biāo)識(shí)ID去服務(wù)器中尋找屬于自己的內(nèi)存空間
  • 服務(wù)端開辟了存放session的內(nèi)存,并把編號(hào)發(fā)給客戶端,客戶端存取數(shù)據(jù)時(shí)把session編號(hào)帶過去
  • session技術(shù)是基于cookie的--存儲(chǔ)session編號(hào)(JSESSONID)
  • 發(fā)送編號(hào)到服務(wù)器,根據(jù)編號(hào)去尋找session的位置是服務(wù)器與客戶端自動(dòng)完成的,不需要自己手動(dòng)編寫代碼(session比cookie更容易,就一個(gè)api)
  • session是一個(gè)域?qū)ο?/li>
  • 公司給你配了個(gè)保險(xiǎn)柜放資料,你可以上下班帶回家(cookie),但是不安全,容易被人偷或者丟失.也可以放公司的保險(xiǎn)柜里(session),但是你需要把鑰匙(sessionId)帶回家.
創(chuàng)建/獲取Session對(duì)象
  • 獲得專屬于當(dāng)前會(huì)話的Session對(duì)象,如果服務(wù)器端沒有該會(huì)話的Session對(duì)象會(huì)創(chuàng)建一個(gè)新的Session返回
  • 如果已經(jīng)有了屬于該會(huì)話的Session直接將已有 的Session返回
  • 實(shí)質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在session了
//創(chuàng)建屬于該客戶端的session對(duì)象,如果存在,則獲取
HttpSession session = request.getSession();
向session中存取數(shù)據(jù)
  • session也是一個(gè)域?qū)ο?/li>
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
Session面試題
  • 你網(wǎng)session存放的數(shù)據(jù)沒了,是什么原因:
    • 瀏覽器請(qǐng)掉cookie緩存了(JSESSIONID沒有了)
    • session過期/失效了
  • Session的生命周期(面試題或者筆試題,問的非常多)
    • 創(chuàng)建:第一次執(zhí)行request.getSession()的時(shí)候創(chuàng)建

    • 銷毀:

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

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

String id = session.getId();//該session對(duì)象的編號(hào)id

//手動(dòng)創(chuàng)建一個(gè)存儲(chǔ)JSESSIONID的Cookie 為該cookie設(shè)置持久化時(shí)間
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB16/");
cookie.setMaxAge(60*10);

response.addCookie(cookie);

response.getWriter().write("JSESSIONID:"+id);
驗(yàn)證碼校驗(yàn)功能
  • web工程中讀取 文件,必須使用絕對(duì)磁盤路徑
  • String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容