1. 程式人生 > 其它 >1301:大盜阿福

1301:大盜阿福

Cookie、Session

1、會話

會話:使用者開啟一個瀏覽器,點選了很多超連結,訪問多個web資源,關閉瀏覽器,這個過程可以稱之為會話

有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學,曾經來過,稱之為狀態會話;

一個網站,怎麼證明你來過?

客戶端 服務端

1.服務端給客戶端一個信件,客戶端下次訪問服務端帶上信件就可以了;cookie

2.伺服器登記你來過了,下次你來的時候我來匹配你;session

2、儲存會話的兩種技術

cookie

  • 客戶端技術(響應,請求)

session

  • 伺服器技術,利用這個技術,可以儲存使用者的會話資訊,我們可以把資訊或者資料放在session中;

3、Cookie

1.從請求中拿到cookie資訊

2.伺服器響應給客戶端cookie

Cookie[] cookies = req.getCookies();	//獲得cookie
cookie.getName();	//獲得cookie中的key
cookie.getValue;	//獲得cookie中的value
new Cookie("lastLoginTime",System.currentTimeMillis() + "");	//新建一個cookie
cookie.setMaxAge(24*60*60);	//設定cookie的有效期
resp.addCookie(cookie);	//響應給客戶端一個cookie

cookie:一般會儲存在本地的使用者目錄下appdata;

一個網站cookie是否存在上限?細節問題

  • 一個cookie只能儲存一個資訊;
  • 一個web站點可以給瀏覽器傳送多個cookie,最多存放20個cookie;
  • cookie大小有限制,為4kb;
  • 瀏覽器cookie上限為300個;

刪除cookie

  • 不設定有效期,關閉瀏覽器,自動失效;

  • 設定有效期時間為0;

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //建立一個cookie,名字要和刪除的名字一致
            Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
        }
    
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //伺服器,告訴你,你來的時間,把這個時間封裝成為一個信件,你下次帶來,就知道你來了

        //解決中文亂碼
        resp.setContentType("text/html");
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        //Cookie,伺服器端從客戶端獲取
        Cookie[] cookies = req.getCookies();
        //判斷cookie是否存在
        if ( cookies != null ) {
            //如果存在
            out.write("你上次訪問的時間是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //獲取cookie的名字
                if (cookie.getName().equals("lastLoginTime")) {
                    //獲取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }
        } else {
            //如果不存在
            out.write("這是你第一次訪問本站");
        }
        //伺服器給客戶端響應一個cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis() + "");
        //設定cookie有效期
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);
        resp.setCharacterEncoding("utf-8");
    }

第一次訪問:

第二次訪問:

編碼解碼

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        Cookie[] cookies = req.getCookies();
        PrintWriter out = resp.getWriter();
        if ( cookies != null ) {
            out.write("你上次訪問的時間是:");
            for ( int i = 0; i < cookies.length; i++ ) {
                Cookie cookie = cookies[i];
                if ( cookie.getName().equals("name") ) {
                    //解碼
                    out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));
                }
            }
        } else {
            out.write("這是你第一次訪問");
        }
        //編碼
        Cookie cookie = new Cookie("name", URLEncoder.encode("提莫", "utf-8"));
        resp.addCookie(cookie);
    }

4、Session(重點)

什麼是session:

  • 伺服器會給每一個使用者(瀏覽器)建立一個session物件;
  • 一個session獨佔一個瀏覽器,只要瀏覽器沒有關閉,這個session就存在;

Session和Cookie的區別

  • Cookie是把使用者的資料寫給使用者的瀏覽器,瀏覽器儲存(可以儲存多個)
  • Session把使用者的資料寫到使用者獨佔session中,伺服器端儲存(儲存重要的資訊,減少伺服器資源的浪費)
  • Session物件由服務建立;

使用Session

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解決亂碼問題
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到session
        HttpSession session = req.getSession();
        //給session中存東西
        //session.setAttribute("name","卡莎");
        session.setAttribute("name",new Person("多多",2));
        //獲取session的ID
        String sessionId = session.getId();
        //判斷session是不是新建立的
        if ( session.isNew() ) {
            resp.getWriter().write("session建立成功,id為:" + sessionId);
        } else {
            resp.getWriter().write("session已經在伺服器中存在了,id為:" + sessionId);
        }
    }

得到Session

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到session
        HttpSession session = req.getSession();
        //獲取session
        // String name = (String) session.getAttribute("name");
        //System.out.println(name);
        Person name = (Person) session.getAttribute("name");
        System.out.println(name);
    }

手動登出Session

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //手動登出Session
        session.invalidate();
    }

會話自動過期:web.xml配置

<!-- 設定Session的預設登出時間 -->
    <session-config>
        <!-- x分鐘後session自動失效,以分鐘為單位 -->
        <session-timeout>15</session-timeout>
    </session-config>