Javaweb_cookie
会话:浏览器与WEB服务器的交互数据,默认完全关闭浏览器这一动作成为一次会话
注意:Session中可以设置保留用户相关数据的时间
Cookie
默认浏览器关闭之后,删除保存的cookie数据文件(默认是一个会话级别的cookie)
cookie概述
cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文件,一旦浏览器保存了某个cookie,在以后每次访问WEB服务器时,都会在HTTP请求头中将这个cookie回传到WEB服务器
底层实现原理
WEB服务器在HTTP响应消息中增加Set-Cookie响应头字段,将Cookie信息发送给浏览器,浏览器通过在HTTP请求消息中增加Cookie请求头字段,将cookie回传给WEB服务器


Cookie相关的方法
1、setMaxAge(int expiry):参数单位:秒,若是负数,表示cookie永远不会被存储,若是0,表示命令浏览器删除cookie数据文件
2、getName():获取key值
3、getValue():获取value值
4、setValue():设置value值
5、setDomain():用于指定只有请求指定的域名,才会带上该cookie
6、setPath:设置cookie作用范围
response
1、HTTPServletResponse接口中定义一个addCookie方法,用于在发送给浏览器的HTTP响应消息中增加一个Set-Cookie响应头字段,这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头
2、HTTPServletResponse接口中定义一个getCookies方法,从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项
示例:添加&读取cookie
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" session="false"%> 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 11 <% 12 //在 JavaWEB 规范中使用 Cookie 类代表 cookie 13 14 15 16 //1. 获取 Cookie 17 Cookie [] cookies = request.getCookies(); 18 if(cookies != null && cookies.length > 0){ 19 for(Cookie cookie: cookies){ 20 //2. 获取 Cookie 的 name 和 value 21 out.print(cookie.getName() + ": " + cookie.getValue()); 22 out.print("<br>"); 23 } 24 }else{ 25 out.print("没有一个 Cookie, 正在创建并返回"); 26 //1. 创建一个 Cookie 对象 27 Cookie cookie = new Cookie("name", "atguigu"); 28 //setMaxAge: 设置 Cookie 的最大时效, 以秒为单位, 若为 0 , 表示立即删除该 Cookie 29 //若为负数, 表示不存储该 Cookie, 若为正数, 表示该 Cookie 的存储时间. 30 cookie.setMaxAge(30);//以秒为单位 31 32 //2. 调用 response 的一个方法把 Cookie 传给客户端. 33 response.addCookie(cookie); 34 } 35 %> 36 37 </body> 38 </html>
示例:利用Cookie实现自动登录
login.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 <form action="doLogin.jsp" method="post"> 11 <input tyep="text" name="username"/> 12 <input type="submit" value="提交"/> 13 </form> 14 </body> 15 </html>
doLogin.jsp:自动登录实现
1 <%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <% 12 String name = request.getParameter("username") ; 13 if(name != null && !name.trim().equals("")){ 14 Cookie cookie = new Cookie("usernameCookie",name) ; 15 cookie.setMaxAge(30) ; 16 response.addCookie(cookie) ; 17 }else{ 18 Cookie[] cookies = request.getCookies() ; 19 if(cookies != null && cookies.length > 0){ 20 for(Cookie cookie : cookies){ 21 String cookieName = cookie.getName() ; 22 if("usernameCookie".equals(cookieName)){ 23 name = cookie.getValue() ; 24 } 25 } 26 } 27 } 28 if(name != null && !name.trim().equals("")){ 29 out.print("Hello:" + name) ; 30 }else{ 31 response.sendRedirect("login.jsp") ; 32 } 33 34 %> 35 </body> 36 </html>
示例:利用Cookie显示最近浏览的5本书籍
books.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" import="java.util.*"%> 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 11 <h4>Books Page</h4> 12 13 <a href="book.jsp?book=JavaWeb">Java Web</a><br><br> 14 <a href="book.jsp?book=Java">Java</a><br><br> 15 <a href="book.jsp?book=Oracle">Oracle</a><br><br> 16 <a href="book.jsp?book=Ajax">Ajax</a><br><br> 17 <a href="book.jsp?book=JavaScript">JavaScript</a><br><br> 18 <a href="book.jsp?book=Android">Android</a><br><br> 19 <a href="book.jsp?book=Jbpm">Jbpm</a><br><br> 20 <a href="book.jsp?book=Struts">Struts</a><br><br> 21 <a href="book.jsp?book=Hibernate">Hibernate</a><br><br> 22 <a href="book.jsp?book=Spring">Spring</a><br><br> 23 24 <br><br> 25 26 <% 27 //显示最近浏览的 5 本书 28 //获取所有的 Cookie 29 Cookie [] cookies = request.getCookies(); 30 31 //从中筛选出 Book 的 Cookie:如果 cookieName 为 ATGUIGU_BOOK_ 开头的即符合条件 32 //显示 cookieValue 33 if(cookies != null && cookies.length > 0){ 34 for(Cookie c: cookies){ 35 String cookieName = c.getName(); 36 if(cookieName.startsWith("ATGUIGU_BOOK_")){ 37 out.println(c.getValue()); 38 out.print("<br>"); 39 } 40 } 41 } 42 %> 43 </body> 44 </html>
book.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" import="java.util.*"%> 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 11 <h4>Book Detail Page</h4> 12 13 Book: <%= request.getParameter("book") %> 14 15 <br><br> 16 17 <a href="books.jsp">Return</a> 18 19 <% 20 String book = request.getParameter("book"); 21 22 //把书的信息以 Cookie 方式传回给浏览器,删除一个 Cookie 23 //1. 确定要被删除的 Cookie: 24 //前提: ATGUIGU_BOOK_ 开头的 Cookie 数量大于或等于 5, 25 Cookie [] cookies = request.getCookies(); 26 27 //保存所有的 ATGUIGU_BOOK_ 开头的 Cookie 28 List<Cookie> bookCookies = new ArrayList<Cookie>(); 29 //用来保存和 books.jsp 传入的 book 匹配的那个 Cookie 30 Cookie tempCookie = null; 31 32 if(cookies != null && cookies.length > 0){ 33 for(Cookie c: cookies){ 34 String cookieName = c.getName(); 35 if(cookieName.startsWith("ATGUIGU_BOOK_")){ 36 bookCookies.add(c); 37 38 if(c.getValue().equals(book)){ 39 tempCookie = c; 40 } 41 } 42 } 43 } 44 45 //①. 且若从 books.jsp 页面传入的 book 不在 ATGUIGU_BOOK_ 的 Cookie 中则删除较早的那个 Cookie 46 //( ATGUIGU_BOOK_ 数组的第一个 Cbookie), 47 if(bookCookies.size() >= 5 && tempCookie == null){ 48 tempCookie = bookCookies.get(0); 49 } 50 51 //②. 若在其中,则删除该 Cookie 52 if(tempCookie != null){ 53 tempCookie.setMaxAge(0); 54 response.addCookie(tempCookie); 55 } 56 57 //2. 把从 books.jsp 传入的 book 作为一个 Cookie 返回 58 59 Cookie cookie = new Cookie("ATGUIGU_BOOK_" + book, book); 60 response.addCookie(cookie); 61 62 %> 63 64 </body> 65 </html>
设置Cookie的作用路径
//设置 Cookie 的作用范围:
cookie.setPath(request.getContextPath()); /web应用名
response.addCookie(cookie);
//Cookie 的 作用范围: 可以作用当前目录和当前目录的子目录. 但不能作用于当前目录的上一级目录.
//可以通过 setPath 方法来设置 Cookie 的作用范围, 其中 / 代表站点的根目录
示例:
readCookie.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 11 <!-- 读取一个 name 为 cookiePath 的 Cookie --> 12 <% 13 String cookieValue = null; 14 15 Cookie [] cookies = request.getCookies(); 16 if(cookies != null && cookies.length > 0){ 17 for(Cookie cookie: cookies){ 18 if("cookiePath".equals(cookie.getName())){ 19 cookieValue = cookie.getValue(); 20 } 21 } 22 } 23 24 if(cookieValue != null){ 25 out.print(cookieValue); 26 }else{ 27 out.print("没有指定的Cookie."); 28 } 29 %> 30 </body> 31 </html>
writeCookie.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 11 <!-- 向客户端浏览器写入一个 Cookie: cookiePath, cookiePathValue --> 12 <% 13 Cookie cookie = new Cookie("cookiePath", "CookiePathValue"); 14 //设置 Cookie 的作用范围: 15 cookie.setPath(request.getContextPath()); 16 response.addCookie(cookie); 17 18 //Cookie 的 作用范围: 可以作用当前目录和当前目录的子目录. 但不能作用于当前目录的上一级目录. 19 //可以通过 setPath 方法来设置 Cookie 的作用范围, 其中 / 代表站点的根目录. 20 %> 21 //"../cookie2.jsp"其中的两点表示上级目录 22 <a href="../cookie2.jsp">To Read Cookie</a> 23 <br><br> 24 //返回当前WEB名称 25 <%= request.getContextPath() %> 26 27 </body> 28 </html>
zwy

浙公网安备 33010602011771号