cookie
作为web服务器,必须能够采用一种机制来唯一标识一个用户,同时记录该用户的状态
会话cookie和持久化cookie
cookie.setMaxAge(30) 设置cookie存在的时间
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
若果过了设置的时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
存储在硬盘上的cookie可以在不不同的浏览器进程间共享,比如两个IE窗口,而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
利用cookie 自动登陆
login.jsp
1 <form action="index.jsp" method="post"> 2 name:<input type="text" name="name"/> 3 <input type="submit" value="Submit"> 4 </form>
index.jsp
1 <% 2 //若可以获取到请求的参数name,则打印出欢迎的信息,把登陆信息存储到Cookie中,并设置Cookie的最大时效30s 3 String name = request.getParameter("name"); 4 if (name != null && !name.trim().equals("")) { 5 6 Cookie cookie = new Cookie("name", name); 7 cookie.setMaxAge(30); 8 response.addCookie(cookie); 9 } else { 10 //从cookie中读取用户信息,若存在则打印欢迎信息 11 Cookie[] cookies = request.getCookies(); 12 if (cookies != null && cookies.length > 0) { 13 for (Cookie cookie : cookies) { 14 String cookieName = cookie.getName(); 15 if ("name".equals(cookieName)) { 16 String val = cookie.getValue(); 17 name = val; 18 } 19 } 20 21 } 22 23 } 24 25 if (name != null && !name.trim().equals("")) { 26 out.print("hello: " + name); 27 } else { 28 //若既没有请求参数,也没有Cookie,则重定向到login.jsp 29 response.sendRedirect("login.jsp"); 30 } 31 %>
利用cookie显示最近浏览的商品
books.jsp
1 <!-- 2 利用 Cookie 实现 "您浏览过的图书有: x, y, z", 只显示最近浏览的 3 本图书的信息 3 且支持 Cookie 的持久化. 其余的 Cookie 被删除: 调用其 setMaxAge() 方法, 传入 4 0 即可。 5 --> 6 7 8 <h4>Books Page</h4> 9 10 <a href="book.jsp?book=JavaWeb">Java Web</a><br><br> 11 <a href="book.jsp?book=Java">Java</a><br><br> 12 <a href="book.jsp?book=Oracle">Oracle</a><br><br> 13 <a href="book.jsp?book=Ajax">Ajax</a><br><br> 14 <a href="book.jsp?book=JavaScript">JavaScript</a><br><br> 15 <a href="book.jsp?book=Android">Android</a><br><br> 16 <a href="book.jsp?book=Jbpm">Jbpm</a><br><br> 17 <a href="book.jsp?book=Struts">Struts</a><br><br> 18 <a href="book.jsp?book=Hibernate">Hibernate</a><br><br> 19 <a href="book.jsp?book=Spring">Spring</a><br><br> 20 21 <br><br> 22 23 <% 24 StringBuilder books = new StringBuilder(""); 25 26 Cookie [] cookies = request.getCookies(); 27 28 if(cookies != null && cookies.length > 0){ 29 30 31 for(Cookie cookie: cookies){ 32 String cookieName = cookie.getName(); 33 String cookieVal = cookie.getValue(); 34 35 if(cookieName.startsWith("book_")){ 36 books.append(cookieVal + " "); 37 } 38 } 39 40 } 41 42 if(!books.toString().equals("")){ 43 out.print("您浏览过的商品有: " + books.toString()); 44 } 45 46 %>
book.jsp
1 <h4>Book Detail Page</h4> 2 3 Book: <%= request.getParameter("book") %> 4 5 <br><br> 6 7 <a href="books.jsp">Return</a> 8 9 <% 10 String book = request.getParameter("book"); 11 Cookie tempCookie = null; 12 13 //只显示最近浏览过的 3 件商品. 14 15 //1. 获取所有满足条件的 Cookie 16 List<Cookie> books = new ArrayList<Cookie>(); 17 18 Cookie [] cookies = request.getCookies(); 19 20 if(cookies != null && cookies.length > 0){ 21 22 23 for(Cookie cookie: cookies){ 24 String cookieName = cookie.getName(); 25 26 if(cookieName.startsWith("book_")){ 27 books.add(cookie); 28 29 String cookieVal = cookie.getValue(); 30 if(cookieVal.equals(book)){ 31 tempCookie = cookie; 32 } 33 } 34 } 35 36 } 37 38 if(books.size() == 5){ 39 if(tempCookie == null){ 40 tempCookie = books.get(0); 41 } 42 43 tempCookie.setMaxAge(0); 44 response.addCookie(tempCookie); 45 } 46 47 //2. 在数组 length == 3 的情况下, 把最早的那个(即数组的第 1 个元素-下标是 0 的那个元素)删除 48 Cookie cookie = new Cookie("book_" + book, book); 49 response.addCookie(cookie); 50 %>
设置cookie的作用路径
cookie的作用范围:可以作用当前目录和当前目录的子目录。但不能作用于当前目录的上一级目录。
设置cookie的作用范围
cookie.setPath(request.getContextPath());
request.getContextPath() 这个是动态的代表web项目地址 如/day_3
可以通过setPath方法来设置cookie的作用域,其中/代表站点的根目录。