问题?
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。