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
packagecom.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); } }