1. 程式人生 > >cookie implements session

cookie implements session

cookie實現會話

  Cookie由瀏覽器儲存於本地PC,伺服器可以響應瀏覽器set-cookie響應頭,瀏覽器收到這個響應頭與數值後,會將它以檔案的形式儲存於本地PC上。當瀏覽器再次訪問同一Web伺服器時,會將之前收到的cookie作為cookie請求頭自動傳送給伺服器。
  Cookie是HTTP header的一部分,其傳輸由HTTP協議控制。
  瀏覽器通常支援每個網站寫出20個cookies。

API使用

  使用setMaxAge()可以設定Cookie的有效期限,單位是“秒”,這樣就會覆蓋預設設定——關閉瀏覽器後Cookie就失效。
  服務端若要讀取瀏覽器提交的cookie,可以通過HttpServletRequest介面的getCookies方法,該方法返回一個Cookie陣列,若沒有cookies則返回null。你需要遍歷整個陣列來查詢某個特定名稱的cookie。目前,還沒有類似於getCookieByName這樣的方法來幫助簡化工作。
  服務端也沒有直接刪除cookie的方法,只能建立一個同名的cookie,並將maxAge屬性設定為0,並新增到HttpServletResponse介面中。

新特徵

  在Servlet 3.0中,Cookie類新增了setHttpOnly()方法,可以將Cookie標示為僅用於HTTP,這會在set-cookie標頭上附加HttpOnly屬性,在瀏覽器支援的情況下,這個Cookie將不會被客戶端指令碼(例如JavaScript)讀取,可以使用isHttpOnly()來得知一個Cookie是否被setHttpOnly()標示為僅用於HTTP。

缺點

  Cookies的問題在於使用者可以通過改變其瀏覽器設定來拒絕接受cookies。       

example

package
com.test; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(
"/write.do") public class WriteCookie extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("Hello", "World"); cookie.setMaxAge(7 * 24 * 60 * 60); resp.addCookie(cookie); resp.getWriter().write("cookie writed"); } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
package com.test;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/read.do")
public class ReadCookie extends HttpServlet {

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                PrintWriter writer = resp.getWriter();
                writer.println("cookie name:    " + name);
                writer.println("cookie value:   " + value);
            }
        }
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}