Http 會(huì)話Cookie與Session


Cookie技術(shù)

會(huì)話數(shù)據(jù)保存在瀏覽器客戶端仇哆。

Cookie類:用于存儲(chǔ)會(huì)話數(shù)據(jù)

  1. 構(gòu)造Cookie對(duì)象
Cookie(java.lang.String name, java.lang.String value)
  1. 設(shè)置cookie
void setPath(java.lang.String uri)   :設(shè)置cookie的有效訪問(wèn)路徑
void setMaxAge(int expiry) : 設(shè)置cookie的有效時(shí)間
void setValue(java.lang.String newValue) :設(shè)置cookie的值
  1. 發(fā)送cookie到瀏覽器端保存
void response.addCookie(Cookie cookie)  : 發(fā)送cookie
  1. 服務(wù)器接收cookie
Cookie[] request.getCookies()  : 接收cookie
Cookie原理
  1. 服務(wù)器創(chuàng)建cookie對(duì)象,把會(huì)話數(shù)據(jù)存儲(chǔ)到cookie對(duì)象中甸箱。
new Cookie("name","value");
  1. 服務(wù)器發(fā)送cookie信息到瀏覽器
response.addCookie(cookie);
舉例: set-cookie: name=flynn (隱藏發(fā)送了一個(gè)set-cookie名稱的響應(yīng)頭)
  1. 瀏覽器得到服務(wù)器發(fā)送的cookie男旗,然后保存在瀏覽器端北戏。
  2. 瀏覽器在下次訪問(wèn)服務(wù)器時(shí)蒜胖,會(huì)帶著cookie信息
舉例: cookie: name=flynn (隱藏帶著一個(gè)叫cookie名稱的請(qǐng)求頭)
  1. 服務(wù)器接收到瀏覽器帶來(lái)的cookie信息
request.getCookies();
示例
public class CookieDemoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 創(chuàng)建cookie對(duì)象
        Cookie cookie = new Cookie("name", "flynn");
        Cookie cookieEmail = new Cookie("email", "123@qq.com");

        // 1.1 設(shè)置Cookie的有效的路徑今缚。默認(rèn)情況:有效路徑在當(dāng)前web應(yīng)用下算柳。
//        cookie.setPath("");
//        cookie.setMaxAge(20); //20秒 從最后不調(diào)用Cookie開(kāi)始計(jì)算
//        cookie.setMaxAge(-1); // Cookie保存在瀏覽器內(nèi)存
//        cookie.setMaxAge(0); // 刪除同名的Cookie
        
        //2. 把Cookie數(shù)據(jù)發(fā)送到瀏覽器(通過(guò)響應(yīng)頭發(fā)送: Set-Cookie名稱)
//        response.setHeader("Set-Cookie","name=flynn");
        //推薦使用這種添加方式,避免手動(dòng)發(fā)送Cookie信息
        response.addCookie(cookie);
        response.addCookie(cookieEmail);

        //3. 接收瀏覽器發(fā)達(dá)的Cookie的信息
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name + "=" + value);
            }
        } else {
            System.out.println("沒(méi)有Cookie的數(shù)據(jù)!");
        }
    }
}
Cookie的細(xì)節(jié)
  1. void setPath(java.lang.String uri):
    設(shè)置cookie的有效訪問(wèn)路徑姓言。有效路徑指的是cookie的有效路徑保存在哪里瞬项,那么瀏覽器在有效路徑下訪問(wèn)服務(wù)器時(shí)就會(huì)帶著cookie信息蔗蹋,否則不帶cookie信息。
  2. void setMaxAge(int expiry) : 設(shè)置cookie的有效時(shí)間囱淋。
    - 正整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的緩存目錄(硬盤中)猪杭,數(shù)值表示保存的時(shí)間。
    - 負(fù)整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的內(nèi)存中妥衣。瀏覽器關(guān)閉cookie就丟失了T硭薄!
    零:表示刪除同名的cookie數(shù)據(jù)
  3. Cookie數(shù)據(jù)類型只能保存非中文字符串類型的税手》涑铮可以保存多個(gè)cookie,但是瀏覽器一般只允許存放300個(gè)Cookie芦倒,每個(gè)站點(diǎn)最多存放20個(gè)Cookie艺挪,每個(gè)Cookie的大小限制為4KB
代碼Demo
public class HistoryServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 獲取當(dāng)前的時(shí)間  
        // 環(huán)境Tomcat 9.0.0.M26下 開(kāi)始格式寫的“yyyy-MM-dd hh:mm:ss” 會(huì)報(bào)一個(gè)異常:An invalid character [32] was present in the Cookie value
        SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
        String currentDate = format.format(new Date());

        // 第一次訪問(wèn) (沒(méi)有Cookie或者 有Cookie但是沒(méi)有名為lastTime的Cookie)
        Cookie[] cookies = request.getCookies();
        String lastTime = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("lastTime".equals(cookie.getName())) {
                    // 有l(wèi)astTime的Cookie 已經(jīng)是第n次訪問(wèn)
                    lastTime = cookie.getValue(); // 上次訪問(wèn)的時(shí)間
                    // 第n次訪問(wèn)
                    response.getWriter().write("歡迎回來(lái)熙暴,您上次訪問(wèn)的時(shí)間為:" + lastTime + ", 當(dāng)前時(shí)間為:" + currentDate);
                    cookie.setValue(currentDate);
                    cookie.setMaxAge(1 * 30 * 24 * 60 * 60); // 保存一個(gè)月
                    response.addCookie(cookie);
                    break;
                }
            }
        }
        if (cookies == null || lastTime == null) { // 第一次訪問(wèn) (沒(méi)有Cookie或者 有Cookie但是沒(méi)有名為lastTime的Cookie)
            // 1.顯示當(dāng)前時(shí)間到瀏覽器
            response.getWriter().write("您是首次訪問(wèn)本網(wǎng)站闺属,當(dāng)前時(shí)間為:" + currentDate);
            // 2.創(chuàng)建Cookie對(duì)象
            Cookie cookie = new Cookie("lastTime", currentDate);
            cookie.setMaxAge(1 * 30 * 24 * 60 * 60); // 保存一個(gè)月
            // 3.Cookie發(fā)送到瀏覽器
            response.addCookie(cookie);
        }
    }
}
Session技術(shù)
Session特點(diǎn):

會(huì)話數(shù)據(jù)保存在服務(wù)器端。(內(nèi)存中)

Session技術(shù)核心

HttpSession類:用于保存會(huì)話數(shù)據(jù)

  1. 創(chuàng)建或得到session對(duì)象
HttpSession getSession()  
HttpSession getSession(boolean create)  
  1. 設(shè)置session對(duì)象
void setMaxInactiveInterval(int interval)  : 設(shè)置session的有效時(shí)間
void invalidate()     : 銷毀session對(duì)象
java.lang.String getId()  : 得到session編號(hào)
  1. 保存會(huì)話數(shù)據(jù)到session對(duì)象
void setAttribute(java.lang.String name, java.lang.Object value)  : 保存數(shù)據(jù)
java.lang.Object getAttribute(java.lang.String name)  : 獲取數(shù)據(jù)
void removeAttribute(java.lang.String name) : 清除數(shù)據(jù)
Sesson細(xì)節(jié)
  • java.lang.String getId() : 得到session編號(hào)
  • 兩個(gè)getSession方法:
    • getSession(true) / getSession() : 創(chuàng)建或得到session對(duì)象周霉。沒(méi)有匹配的session編號(hào)掂器,自動(dòng)創(chuàng) 建新的session對(duì)象。
    • getSession(false): 得到session對(duì)象俱箱。沒(méi)有匹配的session編號(hào)国瓮,返回null
  • void setMaxInactiveInterval(int interval) : 設(shè)置session的有效時(shí)間
    session對(duì)象銷毀時(shí)間:
    • 3.1 默認(rèn)情況30分服務(wù)器自動(dòng)回收
    • 3.2 修改session回收時(shí)間
    • 3.3 全局修改session有效時(shí)間
    • 3.4 手動(dòng)銷毀session對(duì)象
<!-- 修改session全局有效時(shí)間:分鐘 -->
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

void invalidate()     : 銷毀session對(duì)象
  • 如何避免瀏覽器的JSESSIONID的cookie隨著瀏覽器關(guān)閉而丟失的問(wèn)題
/**
 * 手動(dòng)發(fā)送一個(gè)硬盤保存的cookie給瀏覽器
 */
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狞谱,隨后出現(xiàn)的幾起案子乃摹,更是在濱河造成了極大的恐慌,老刑警劉巖跟衅,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵睬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伶跷,警方通過(guò)查閱死者的電腦和手機(jī)掰读,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叭莫,“玉大人蹈集,你說(shuō)我怎么就攤上這事」统酰” “怎么了拢肆?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我郭怪,道長(zhǎng)支示,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任鄙才,我火速辦了婚禮悼院,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咒循。我一直安慰自己据途,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布叙甸。 她就那樣靜靜地躺著颖医,像睡著了一般。 火紅的嫁衣襯著肌膚如雪裆蒸。 梳的紋絲不亂的頭發(fā)上熔萧,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音僚祷,去河邊找鬼佛致。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辙谜,可吹牛的內(nèi)容都是我干的俺榆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼装哆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罐脊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蜕琴,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萍桌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凌简,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體上炎,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年雏搂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了藕施。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔派,死狀恐怖铅碍,靈堂內(nèi)的尸體忽然破棺而出润绵,到底是詐尸還是另有隱情线椰,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布尘盼,位于F島的核電站憨愉,受9級(jí)特大地震影響烦绳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜配紫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一径密、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躺孝,春花似錦享扔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至于个,卻和暖如春氛魁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厅篓。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工秀存, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羽氮。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓或链,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親档押。 傳聞我的和親對(duì)象是個(gè)殘疾皇子株扛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容