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>