JavaWeb:Cookie

问题?

HTTP 协议是一种无状态的协议,WEB 服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。

作为WEB 服务器必须能够采用一种机制来唯一的标识一个用户,同时记录该用户的状态。

解决:

在Servlet 规范中,常用 Cookie 和 Session 这两种机制来完成会话跟踪。

这里先记录Cookie 的学习内容。

Cookie :

1)、完成会话跟踪的一种机制。是在客户端保持 HTTP 状态信息的。

2)、一旦浏览器保存了某个 Cookie,那么它在以后每次访问该WEB 服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。

3)相关的一些方法:

--创建一个Cookie 对象

Cookie cookie = new Cookie("name", "value");

--setMaxAge:设置Cookie 最大时效,以秒为单位,

若为0,表示立即删除该Cookie;若为负数,表示不存储该Cookie;若为正数,表示该Cookie 的时效时间。

cookie.setMaxAge(30);

--设置 Cookie 的作用范围:因为默认可以作用当前目录和当前目录的子目录,但不能作用于当前目录的上一级目录。

cookie.setPath(request.getContextPath());

--调用 response 的一个方法把 Cookie 传给客户端

response.addCookie(cookie);

--从浏览器读取 Cookie

1                 Cookie[] cookies = request.getCookies();
2                 if(cookies != null && cookies.length > 0){
3                     //遍历得到我想要的那个Cookie 
4                     for(Cookie cookie : cookies){
5                       //获取Cookie 的 name 和 value
6                         String name = cookie.getName();
7                         String val = cookie.getValue();
8                    }        

4)、如果不设置过期时间,默认情况下Cookie 的生命周期是浏览器会话期间,只要浏览器关闭了,Cookie 就失效了,这样的Cookie 是会话Cookie。设置了过期时间,关闭后再打开浏览器,这个Cookie 依然有效直到超过设定的过期时间。

5)、应用:

显示最近浏览过的5本书的信息:在booklist.jsp 页面选择你想浏览的一本书。点击就会进入这本书的页面book.jsp ,会显示这本书的信息且点击return 就回退,并且会把浏览过的书籍的信息以Cookie 的方式传给浏览器。但是只保留显示最新的几条浏览记录。

用了两个JSP 页面,简单的实现了一下。

booklist.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <h4>Books Page:</h4>
11     <!-- ?后面的book 是要作为 Cookie的 value 的 -->
12     <a href="book.jsp?book=Javaweb">Javaweb</a> 
13     <br><br>
14     <a href="book.jsp?book=Java">Java</a>
15     <br><br>
16     <a href="book.jsp?book=MySql">MySql</a>
17     <br><br>
18     <a href="book.jsp?book=Oracle">Oracle</a>
19     <br><br>
20     <a href="book.jsp?book=JavaScript">JavaScript</a>
21     <br><br>
22     <a href="book.jsp?book=jQuery">jQuery</a>
23     <br><br>
24     <a href="book.jsp?book=Android">Android</a>
25     <br><br>
26     <a href="book.jsp?book=Ajax">Ajax</a>
27     <br><br>
28     
29     <%
30         //1、获取所有的 Cookie
31         //2、从中筛选出 book  的 Cookie 如果 cookieName 为 hnust_book 开头的即符合条件
32         //3、显示 cookieValue 
33         Cookie[] cookies = request.getCookies();
34         if(cookies != null && cookies.length > 0){
35             for(Cookie c : cookies){
36                 String cName = c.getName();
37                 if(cName.startsWith("hnust_book_")){
38                     out.print(c.getValue() + "   "); 
39                     //out.print("<br>");
40                 }
41             }
42         }
43     %>
44 </body>
45 </html>

book.jsp:

 1 <%@page import="java.util.List"%>
 2 <%@page import="java.util.ArrayList"%>
 3 <%@ page language="java" contentType="text/html; charset=UTF-8"
 4     pageEncoding="UTF-8"%>
 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 6 <html>
 7 <head>
 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 9 <title>Insert title here</title>
10 </head>
11 <body>
12     <h4>Book Detals Page</h4>
13     book: <%= request.getParameter("book") %>
14     <br><br>
15     <a href="booklist.jsp">Return</a>
16     <br>
17     
18     <%
19         //把从booklist.jsp 页面传过来的 book 作为一个 Cookie 返回。 
20         String book = request.getParameter("book");
21     
22         //删除一个Cookie,前提是:以hnust_book_ 开头的 这个Cookie 且它的数量大于等于5 
23         //获取所有的Cookie 
24         Cookie[] cookies = request.getCookies();
25         //保存所有 以hnust_book_ 开头的 这个Cookie 
26         List<Cookie> bookList = new ArrayList<Cookie>();
27         //保存和 从 booklist.jsp 传过来的 book 匹配的 book  
28         Cookie tempBook = null;
29         if(cookies != null && cookies.length > 0){
30             //遍历 
31             for(Cookie c : cookies){
32                 //获取Cookie 的 name , 选取 以hnust_book_ 开头的,放入数组中 
33                 String name = c.getName();
34                 if(name.startsWith("hnust_book_")){
35                     //选取 以hnust_book_ 开头的 Cookie,放入数组中 
36                     bookList.add(c);
37                     //保存和 booklist.jsp 传过来的 book 匹配的Cookie 的book 
38                     if(c.getValue().equals(book)){
39                         tempBook = c;
40                     }            
41                 }
42             }
43         }
44         //①、如果从booklist.jsp 传过来的 book,在Cookie 中没有,就删除 这个数组的第一个
45         if(bookList.size() >= 5 && tempBook == null){
46             tempBook = bookList.get(0);
47         }
48         //②、如果在Cookie 中存在,就删除存在的这个Cookie。 
49         if(tempBook != null){
50             tempBook.setMaxAge(0);
51             response.addCookie(tempBook);
52         }
53         
54         //给这个 book Cookie 一个标识符hnust_book_ 
55         //注意:(这段代码,如果放在了前面,那么②步删除Cookie后,新的Cookie并不会返回到 booklist.jsp 页面)   
56         Cookie cookie = new Cookie("hnust_book_" + book, book);
57         response.addCookie(cookie);
58     %>
59 </body>
60 </html>

结果:

over。

原文地址:https://www.cnblogs.com/daoxiaobai/p/6275446.html