JavaWeb之Cookie:會話跟蹤的一種機制
Cookie 機制採用的是客戶端保持HTTP狀態信息的方案。
Cookie 是在瀏覽器訪問WEB服務器的某個資源是,有WEB服務器再HTTP響應消息頭中附帶傳送給瀏覽器的一個小文本文件,一旦WEB瀏覽器保存的某個Cookie,那麼它在以後每次訪問該WEB服務器時,都會在HTTP請求頭中將這個Cookie回傳個WEB服務器。如果創建了一個Cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的Cookie,存儲在瀏覽器的內存中,用戶默認退出瀏覽器後被刪除,若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒爲單位的時間。
----setMaxAge 設置Cookie的最大時效,以秒爲單位,若爲0,表示立即刪除該Cookie,若爲負數表示不存儲該Cookie。
----setPath 設置Cookie的作用範圍。可以作用當前目錄和當前目錄的子目錄,但不能作用於當前目錄的上一級目錄。
----response.addCookie(cookie);調用response的一個方法把Cookie 傳給客戶端。
使用Cookie 實現顯示最近瀏覽的商品:
books.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="book.jsp?book=1">1</a><br>
<a href="book.jsp?book=2">2</a><br>
<a href="book.jsp?book=3">3</a><br>
<a href="book.jsp?book=4">4</a><br>
<a href="book.jsp?book=5">5</a><br>
<a href="book.jsp?book=6">6</a><br>
<a href="book.jsp?book=7">7</a><br>
<a href="book.jsp?book=AAA">AAA</a><br>
<br><br>
<%
//獲取所有的Cookie,選擇符合條件的
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
String cookieName = c.getName();
if (cookieName.startsWith("BOOK_")) {
out.print(c.getValue());
out.print("<br>");
}
}
}
%>
</body>
</html>
book.jsp
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Book Detail Page</h4>
Book:<%=request.getParameter("book")%>
<br>
<br>
<a href="books.jsp">Return</a>
<%
String book = request.getParameter("book");
//1.確定要被刪除的Cookie
//前提:BOOK開頭的Cookie數量大於或等於5
Cookie[] cookies = request.getCookies();
List<Cookie> bookCookies = new ArrayList<Cookie>();
//用來保存和books.jsp傳入的book匹配的那個Cookie
Cookie tempCookie = null;
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
String cookieName = c.getName();
if (cookieName.startsWith("BOOK_")) {
bookCookies.add(c);
if(c.getValue().equals(book)){
tempCookie = c;
}
}
}
}
//若從books.jsp頁面傳入的book不在Book_的Cookie中則刪除第一個Cookie
if(bookCookies.size() > 5 && tempCookie == null){
tempCookie = bookCookies.get(0);
}
//若在其中,則刪除該Cookie,放置新的進去
if(tempCookie != null){
tempCookie.setMaxAge(0);
response.addCookie(tempCookie);
}
//2.把從books.jsp傳入的book作爲一個Cookie返回
Cookie c = new Cookie("BOOK_" + book, book);
response.addCookie(c);
%>
</body>
</html>