Web 基礎(chǔ)12 會話技術(shù)及其Cookie對象入門

1.1 會話技術(shù)簡介

??會話可以簡單理解為,一個用戶打開一個瀏覽器,在同一個WEB應(yīng)用上彤枢,點(diǎn)擊多個超鏈接,訪問多個WEB資源筒饰,然后關(guān)閉瀏覽器缴啡,那這整個過程我們稱之為一個會話.

1.1.1 會話技術(shù)作用

  • 會話技術(shù)可以保存用戶在會話過程中所產(chǎn)生的數(shù)據(jù)

  • 會話技術(shù)也可以讓用戶在同一個會話中實(shí)現(xiàn)數(shù)據(jù)的共享

  • 會話應(yīng)用場景的思路風(fēng)暴

  • 想保存數(shù)據(jù)到購物車 不重要 個人私有

    • 保存哪里 服務(wù)器? 數(shù)據(jù)庫 淘寶 京東 不登錄
    • 編程最重要的域?qū)ο? 域?qū)ο?臨時存儲數(shù)據(jù)
      • 瀏覽器

        • 可能會被清掉 服務(wù)器怎么知道瀏覽器里面有購物車數(shù)據(jù)
        • 每次訪問服務(wù)器的時候把這個數(shù)據(jù)給帶過去
      • 服務(wù)器

        • 占用空間 弄混 我怎么識別這個數(shù)據(jù)是誰的
        • 我怎么讓用戶證明這個數(shù)據(jù)是他的
      • 存在瀏覽器,主要問題是帶來帶去 存服務(wù)器主要問題是

      • 我要識別這個數(shù)據(jù)是誰的

      • 歸根到底: 會話技術(shù)就是用來臨時保存數(shù)據(jù)的

1.1.12 會話技術(shù)分類

  • cookie

    • cookie是一種客戶端技術(shù),程序可以把每一個用戶特有的數(shù)據(jù)瓷们,以響應(yīng)頭set- cookie發(fā)送給每一個用戶的瀏覽器业栅,那最終會以文件的形式保存在用戶的硬盤上,
    • 當(dāng)用戶再次使用瀏覽器來訪問我們的WEB服務(wù)器换棚,用戶的瀏覽器會帶上他特有的數(shù)據(jù)式镐,而我們的程序所處理的則是來訪用戶特有的數(shù)據(jù)。
  • session

    • session是一種服務(wù)器技術(shù)固蚤,WEB服務(wù)器會在運(yùn)行時為每一個用戶的每一個會話創(chuàng)建一個其獨(dú)享的HttpSession對象娘汞,
    • 由于session對象是用戶獨(dú)享的,所以我們可以使用session對象來保存用戶在一個會話過程中所產(chǎn)生的數(shù)據(jù)夕玩。
    • session對象也是一個域?qū)ο竽阆遥秶钦麄€會話
  • 注意:

    • cookie 把數(shù)據(jù)保存在用戶的硬盤上
    • session 把數(shù)據(jù)保存在服務(wù)器的內(nèi)存上
  • 會話: 打開淘寶--瀏覽--關(guān)閉 一個會話

    • cookie
      • 存在瀏覽器
        • 服務(wù)器先創(chuàng)建出來
        • 隨著響應(yīng)帶到瀏覽器,然后瀏覽器做臨時保存,保存完之后,下次請求在帶回去
      • 優(yōu)點(diǎn):
        • 減少服務(wù)器的壓力,服務(wù)器內(nèi)存可以少用一點(diǎn)
      • 缺點(diǎn):
        • 換一個瀏覽器就獲取不到
        • 隨時都會被清理,適合保存不重要的東西
        • 帶來帶去,占用帶寬,適合存小的東西,如果過大,用戶等待的時候很長
        • 數(shù)據(jù)傳來傳去, 不安全
      • 總結(jié): 不必要的,比較小的,不涉及安全性的內(nèi)容,用cookie
    • session
      • 存在服務(wù)器
      • session 就是一個域?qū)ο?(setAttribute getAttribute,removeAttribute),就是通過這個保存數(shù)據(jù)

1.2 Cookie 常用方法

1.2.1 Cookie的方法

方法 描述
Cookie(String name, String value) Constructs a cookie with a specified name and value.
void setMaxAge(int expiry) Sets the maximum age of the cookie in seconds.
void setPath(String uri) Specifies a path for the cookie to which the client should return the cookie.
String getName() Returns the name of the cookie.
String getValue() Returns the value of the cookie.

1.2.2 關(guān)于Cookie對象的方法

Cookie[] cs = request.getCookies();

得到的是一個數(shù)組,通過遍歷可以得到自己想要的Cookie信息

添加Cookie對象

response.addCookie(c);

其中參數(shù)c 為cookie對象

設(shè)置有效時間

void setMaxAge(int expiry) 
cookie.setMaxAge(60 * 60 * 24);//有效期一天
cookie.setMaxAge(-1);//當(dāng)瀏覽器關(guān)閉,會話結(jié)束后cookie會自動的被刪除
cookie.setMaxAge(0);//cookie會立刻被刪除
cookie.setMaxAge(Integer.MAX_VALUE);//最長的有效時間

設(shè)置路徑

void setPath(String uri)//霧霾 江蘇  南京市 上海 
當(dāng)用戶訪問這個路徑下的web資源,或者是這個路徑下子路徑的資源,他都會自動攜帶這個cookie
cookie.setPath("/myCookie");//cookie的默認(rèn)路徑是當(dāng)前WEB應(yīng)用的根路徑
cookie.setPath(request.getContextPath());//推薦使用這個方法,比較靈活

1.2.3 關(guān)于Cookie的一些細(xì)節(jié)

  • 一個cookie只能用來標(biāo)識一種信息燎孟,而cookie至少需要包含這個信息的名稱和值
  • 一個網(wǎng)站可以向一個瀏覽器提供多個cookie禽作,而一個瀏覽器也可以接收多個網(wǎng)站所提供的cookie
  • 一個瀏覽器一般最多可以接收300個cookie,一個網(wǎng)站所對應(yīng)的cookie最多為20個揩页,一個cookie大小限制為4kb
  • 創(chuàng)建一個cookie對象旷偿,發(fā)送至客戶端,那這個cookie他默認(rèn)的級別是會話級別
  • 會話級別:當(dāng)用戶關(guān)閉瀏覽器,會話結(jié)束了萍程,那這個cookie也被刪除了
    [圖片上傳中...(記錄用戶上次訪問時間分析.png-a00c2d-1522371203795-0)]
  • 如果需要把cookie保存在用戶的硬盤上幢妄,需要設(shè)置cookie的有效時間(過期時間)
  • cookie的名稱和值都不可以使用中文,因?yàn)橹形谋徽J(rèn)為是不安全的字符

1.3 Cookie 入門案例

圖解

記錄用戶上次訪問時間分析.png

1.3.1 記錄用戶上次的訪問時間

思路整理

  • 拿到指定的cookie信息
  • 判斷是否為null
    • 如果為null,給出提示信息
    • 否則,獲取上次的訪問時間,并顯示
  • 獲得當(dāng)前的時間存在cookie當(dāng)中,發(fā)到客戶端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //記錄用戶上次的訪問時間
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        //獲取cookie信息
        Cookie[] cs = request.getCookies();
        
        if(cs != null) {
            for (int i = 0; i < cs.length; i++) {
                String name = cs[i].getName();
                if("lastAccessTime".equals(name)) {
                    cookie = cs[i];
                    break;
                }
            }
        }
        
        //判斷是否有上次的訪問時間
        if(cookie == null) {
            //如果沒有上次的訪問時間茫负,需要給出提示信息
            out.println("歡迎第一次訪問");
        }
        else {
            //如果有上次的訪問時間蕉鸳,需要獲取上次的訪問時間并顯示
            String value = cookie.getValue();
            out.println("您上次的訪問時間為:" + value);
        }
        
        
        
        
        //獲取這次的訪問時間(當(dāng)前的系統(tǒng)時間)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String now = sdf.format(new Date());
        
        //創(chuàng)建Cookie對象
        Cookie c = new Cookie("lastAccessTime",now);
        //記錄用戶這次的訪問時間,并發(fā)送至客戶端
        response.addCookie(c);
         
    }

1.3.2 記住用戶名

登錄頁面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設(shè)置響應(yīng)類型和編碼
        response.setContentType("text/html;charset=UTF-8");
        //獲取輸出流對象
        PrintWriter out = response.getWriter();
        
        Cookie[] cs = request.getCookies();
        Cookie cookie = CookieUtils.getCookie(cs, "username");
        String username = "";
        String checked = "";
        
        if (cookie != null) {
            username = cookie.getValue();
            checked = "checked = 'checked'";
        }
        
        out.println("<html>");
        out.println("<head>");
        out.println("<title>登錄頁面</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<form action='/myCookie/LoginServlet' method='post'>");
        out.println("用戶名:<input type='text' name='username' value='"+username+"' />");
        out.println("<br />");
        out.println("密碼:<input type='text' name='password' />");
        out.println("<br />");
        out.println("<input type='submit' value='登錄' />");
        out.println("<input type='checkbox' name='remember' value='1'"+checked+" />記住用戶名");
        out.println("</form>");
        out.println("</body>");
        out.println("</html>");

    }

跳轉(zhuǎn)頁面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設(shè)置響應(yīng)類型和編碼
        response.setContentType("text/html;charset=UTF-8");
        //獲取輸出流對象
        PrintWriter out = response.getWriter();
        
        out.println("<h1>我是首頁</h1>");
    }

處理頁面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設(shè)置響應(yīng)類型和編碼
        response.setContentType("text/html;charset=UTF-8");
        //獲取輸出流對象
        PrintWriter out = response.getWriter();
        
        //獲取用戶名
        String username = request.getParameter("username");
        //獲取密碼
        String password = request.getParameter("password");
        //獲取復(fù)選框記住用戶名的值
        String remember = request.getParameter("remember");
        
        System.out.println(username);
        System.out.println(password);
        
        //判斷用戶名和密碼是否有效
        if ("itcast".equals(username) && "123456".equals(password)) {
            //登錄成功
            out.println("登錄成功,3秒后跳轉(zhuǎn)首頁");
            response.setHeader("Refresh", "3;URL=/myCookie/IndexServlet");
            
            if ("1".equals(remember)) {
                //需要記住用戶名
                //創(chuàng)建Cookie對象
                Cookie cookie = new Cookie("username", username);
                //設(shè)置cookie的有效時間
                cookie.setMaxAge(Integer.MAX_VALUE);
                //發(fā)送cookie至客戶端
                response.addCookie(cookie);
            }else {
                //不需要記住用戶名
                Cookie cookie = new Cookie("username", "");
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
            
        }else {
            //登錄失敗
            out.println("用戶名或者密碼錯誤,3秒后跳轉(zhuǎn)到登錄頁面");
            response.setHeader("Refresh", "3;URL=/myCookie/LoginUIServlet");
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忍法,一起剝皮案震驚了整個濱河市潮尝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饿序,老刑警劉巖勉失,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗤堰,居然都是意外死亡戴质,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門踢匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戈抄,你說我怎么就攤上這事离唬。” “怎么了划鸽?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵输莺,是天一觀的道長。 經(jīng)常有香客問我裸诽,道長嫂用,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任丈冬,我火速辦了婚禮嘱函,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埂蕊。我一直安慰自己往弓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布蓄氧。 她就那樣靜靜地躺著函似,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喉童。 梳的紋絲不亂的頭發(fā)上撇寞,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼蔑担。 笑死牌废,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钟沛。 我是一名探鬼主播畔规,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恨统!你這毒婦竟也來了叁扫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤畜埋,失蹤者是張志新(化名)和其女友劉穎莫绣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠鞍,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对室,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咖祭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掩宜。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖么翰,靈堂內(nèi)的尸體忽然破棺而出牺汤,到底是詐尸還是另有隱情,我是刑警寧澤浩嫌,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布檐迟,位于F島的核電站,受9級特大地震影響码耐,放射性物質(zhì)發(fā)生泄漏追迟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一骚腥、第九天 我趴在偏房一處隱蔽的房頂上張望敦间。 院中可真熱鬧,春花似錦桦沉、人聲如沸每瞒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剿骨。三九已至,卻和暖如春埠褪,著一層夾襖步出監(jiān)牢的瞬間浓利,已是汗流浹背挤庇。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贷掖,地道東北人嫡秕。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像苹威,于是被迫代替她去往敵國和親昆咽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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