(重溫)JavaWeb--Cookie 和 Session入門總結(瞭解cookie和session這一篇就夠了)

1、Cookie 餅乾

a)什麼是 Cookie?

  1. Cookie 翻譯過來是餅乾的意思。
  2. Cookie 是服務器通知客戶端保存鍵值對的一種技術。
  3. 客戶端有了 Cookie 後,每次請求都發送給服務器。
  4. 每個 Cookie 的大小不能超過 4kb。

b)如何創建 Cookie

Servlet 程序中的代碼:

 protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        //1 創建 Cookie 對象
        Cookie cookie = new Cookie("key4", "value4");
        //2 通知客戶端保存 Cookie
        resp.addCookie(cookie);
        //1 創建 Cookie 對象
        Cookie cookie1 = new Cookie("key5", "value5");
        //2 通知客戶端保存 Cookie
        resp.addCookie(cookie1);
        resp.getWriter().write("Cookie 創建成功");
    }

c)服務器如何獲取 Cookie

      服務器獲取客戶端的 Cookie 只需要一行代碼:req.getCookies():Cookie[]

Cookie 的工具類:

public class CookieUtils {
    /**
     * 查找指定名稱的 Cookie 對象
     * @param name
     * @param cookies
     * @return
     */
    public static Cookie findCookie(String name , Cookie[] cookies){
        if (name == null || cookies == null || cookies.length == 0) {
            return null;
        }
        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                return cookie;
            }
        }
        return null;
    }
}

Servlet 程序中的代碼:

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
        // getName 方法返回 Cookie 的 key(名)
        // getValue 方法返回 Cookie 的 value 值
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
        }
        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
        // for (Cookie cookie : cookies) {
        // if ("key2".equals(cookie.getName())) {
        // iWantCookie = cookie;
        // break;
        // }
        // }
        // 如果不等於 null,說明賦過值,也就是找到了需要的 Cookie
        if (iWantCookie != null) {
            resp.getWriter().write("找到了需要的 Cookie");
        }
    }

d)Cookie 值的修改

方案一:

  1. 先創建一個要修改的同名(指的就是 key)的 Cookie 對象
  2. 在構造器,同時賦於新的 Cookie 值。
  3. 調用 response.addCookie( Cookie );
// 方案一:
// 1、先創建一個要修改的同名的 Cookie 對象
// 2、在構造器,同時賦於新的 Cookie 值。
Cookie cookie = new Cookie("key1","newValue1");
// 3、調用 response.addCookie( Cookie ); 通知 客戶端 保存修改
resp.addCookie(cookie);

方案二:

  1. 先查找到需要修改的 Cookie 對象
  2. 調用 setValue()方法賦於新的 Cookie 值。
  3. 調用
// 方案二:
// 1、先查找到需要修改的 Cookie 對象
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
if (cookie != null) {
// 2、調用 setValue()方法賦於新的 Cookie 值。
cookie.setValue("newValue2");
// 3、調用 response.addCookie()通知客戶端保存修改
resp.addCookie(cookie);
}

e)瀏覽器查看 Cookie:

f) Cookie 生命控制

Cookie 的生命控制指的是如何管理 Cookie 什麼時候被銷燬(刪除)

setMaxAge()

  1. 正數,表示在指定的秒數後過期
  2. 負數,表示瀏覽器一關,Cookie 就會被刪除(默認值是-1)
  3. 零,表示馬上刪除 Cookie
/**
     * 設置存活 1 個小時的 Cooie
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        Cookie cookie = new Cookie("life3600", "life3600");
        cookie.setMaxAge(60 * 60); // 設置 Cookie 一小時之後被刪除。無效
        resp.addCookie(cookie);
        resp.getWriter().write("已經創建了一個存活一小時的 Cookie");
    }

    /**
     * 馬上刪除一個 Cookie
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        // 先找到你要刪除的 Cookie 對象
        Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
        if (cookie != null) {
            // 調用 setMaxAge(0);
            cookie.setMaxAge(0); // 表示馬上刪除,都不需要等待瀏覽器關閉
            // 調用 response.addCookie(cookie);
            resp.addCookie(cookie);
            resp.getWriter().write("key4 的 Cookie 已經被刪除");
        }
    }

    /**
     * 默認的會話級別的 Cookie
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        Cookie cookie = new Cookie("defalutLife", "defaultLife");
        cookie.setMaxAge(-1);//設置存活時間
        resp.addCookie(cookie);
    }

g)Cookie 有效路徑 Path 的設置

Cookie 的 path 屬性可以有效的過濾哪些 Cookie 可以發送給服務器。哪些不發。
path 屬性是通過請求的地址來進行有效的過濾。


CookieA path=/工程路徑
CookieB path=/工程路徑/abc


請求地址如下:
    http://ip:port/工程路徑/a.html
      CookieA 發送
      CookieB 不發送
    http://ip:port/工程路徑/abc/a.html
      CookieA 發送
      CookieB 發送

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        Cookie cookie = new Cookie("path1", "path1");
        // getContextPath() ===>>>> 得到工程路徑
        cookie.setPath( req.getContextPath() + "/abc" ); // ===>>>> /工程路徑/abc
        resp.addCookie(cookie);
        resp.getWriter().write("創建了一個帶有 Path 路徑的 Cookie");
    }

h) Cookie 練習---免輸入用戶名登錄

login.jsp 頁面

<form action="http://localhost:8080/13_cookie_session/loginServlet" method="get">
    用戶名:<input type="text" name="username" value="${cookie.username.value}"> <br>
    密碼:<input type="password" name="password"> <br>
    <input type="submit" value="登錄">
</form>

LoginServlet 程序:

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("wzg168".equals(username) && "123456".equals(password)) {
            //登錄 成功
            Cookie cookie = new Cookie("username", username);
            cookie.setMaxAge(60 * 60 * 24 * 7);//當前 Cookie 一週內有效
            resp.addCookie(cookie);
            System.out.println("登錄 成功");
        } else {
            // 登錄 失敗
            System.out.println("登錄 失敗");
        }
    }

2、Session 會話

i) 什麼是 Session 會話?

    1、Session 就一個接口(HttpSession)。
    2、Session 就是會話。它是用來維護一個客戶端和服務器之間關聯的一種技術。
    3、每個客戶端都有自己的一個 Session 會話。
    4、Session 會話中,我們經常用來保存用戶登錄之後的信息。

j) 如何創建 Session 和獲取(id 號,是否爲新)

    如何創建和獲取 Session。它們的 API 是一樣的。
    request.getSession()
        第一次調用是:創建 Session 會話
        之後調用都是:獲取前面創建好的 Session 會話對象。
    isNew(); 判斷到底是不是剛創建出來的(新的)
        true 表示剛創建
        false 表示獲取之前創建
    每個會話都有一個身份證號。也就是 ID 值。而且這個 ID 是唯一的。
    getId() 得到 Session 的會話 id 值。

k)Session 域數據的存取

/**
     * 往 Session 中保存數據
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        req.getSession().setAttribute("key1", "value1");
        resp.getWriter().write("已經往 Session 中保存了數據");
    }
    /**
     * 獲取 Session 域中的數據
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        Object attribute = req.getSession().getAttribute("key1");
        resp.getWriter().write("從 Session 中獲取出 key1 的數據是:" + attribute);
    }

l) Session 生命週期控制

public void setMaxInactiveInterval(int interval) 設置 Session 的超時時間(以秒爲單位),超過指定的時長,Session
就會被銷燬。
    值爲正數的時候,設定 Session 的超時時長。
    負數表示永不超時(極少使用)
    public int getMaxInactiveInterval()獲取 Session 的超時時間
public void invalidate() 讓當前 Session 會話馬上超時無效。

Session 默認的超時時長是多少!
    Session 默認的超時時間長爲 30 分鐘。
    因爲在 Tomcat 服務器的配置文件 web.xml中默認有以下的配置,它就表示配置了當前 Tomcat 服務器下所有的 Session
    超時配置默認時長爲:30 分鐘。
    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>
如果說。你希望你的 web 工程,默認的 Session 的超時時長爲其他時長。你可以在你自己的 web.xml 配置文件中做
以上相同的配置。就可以修改你的 web 工程所有 Seession 的默認超時時長。

<!--表示當前 web 工程。創建出來 的所有 Session 默認是 20 分鐘 超時時長-->
<session-config>
   <session-timeout>20</session-timeout>
</session-config

如果你想只修改個別 Session 的超時時長。就可以使用上面的 API。setMaxInactiveInterval(int interval)來進行單獨的設
置。
    session.setMaxInactiveInterval(int interval)單獨設置超時時長。

Session 超時的概念介紹:

    protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
// 先獲取 Session 對象
        HttpSession session = req.getSession();
// 設置當前 Session3 秒後超時
        session.setMaxInactiveInterval(3);
        resp.getWriter().write("當前 Session 已經設置爲 3 秒後超時");
    }

Session 馬上被超時示例:

    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
// 先獲取 Session 對象
        HttpSession session = req.getSession();
// 讓 Session 會話馬上超時
        session.invalidate();
        resp.getWriter().write("Session 已經設置爲超時(無效)");
    }

m) 瀏覽器和 Session 之間關聯的技術內幕

Session 技術,底層其實是基於 Cookie 技術來實現的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章