寫入客戶端的Cookie一般有兩種,一種是不設置生存週期的Cookie,一種是設置了生存週期的Cookie。前者隨着當前打開的瀏覽器窗口的存活而存活,當瀏覽器窗口關閉之後,Cookie隨之消失。另一種Cookie在被設置生存週期後寫入到了本地的磁盤文件中,存活時間由設定的時間決定,即使關閉窗口Cookie也不會消失。
以下兩段代碼來做實驗。
SetCookie.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SetCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
for(int i=0;i<3;++i){
Cookie cookie = new Cookie("key"+i,"value"+i);//沒有設置生存週期的Cookie,關閉瀏覽器窗口後消失
resp.addCookie(cookie);
cookie = new Cookie("mypersistentk"+i,"mypersistentv"+i);
cookie.setMaxAge(3600);//設置生存時間爲一個小時,被寫入到了磁盤文件中保存起來
resp.addCookie(cookie);
}
PrintWriter pw = resp.getWriter();
pw.print("<a href='http://localhost:8080:test/servlet/ShowCookie'>go</a>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
ShowCookie.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter pw = resp.getWriter();
Cookie[] cookies = req.getCookies();//打印出之前設置的Cookie
for(int i=0;i<cookies.length;++i){
Cookie cookie = cookies[i];
pw.println(cookie.getName()+":"+cookie.getValue());
pw.println();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
運行SetCookie再運行ShowCookie後會打印出6條Coookie,包括沒有生存週期的和有生存週期的。當關閉當前窗口,重新打開一個窗口再運行ShowCookie時只會出現三條Cookie記錄,也就是之前設置生存週期被存入磁盤文件的那三條,而沒有設置生存週期的另外三條Cookie隨着瀏覽器窗口的關閉而死亡。
注意:在當前窗口打開的子窗口,即。按下Ctrl+n鍵時出現的窗口能夠獲得其父窗口的Cookie,包括沒有設置生存週期的Cookie
補充:servlet/jsp設置的Cookie只能被當前路徑以及其子路徑下的sevlet/jsp讀取到(這裏的路徑指的是url地址,即web.xml裏配置的url-pattern)