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>
View Code

 

示例:利用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>
View Code

 

 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>
View Code

 

 

示例:利用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>
View Code

 

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 数量大于或等于 525         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>
View Code

 

 

设置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>
View Code

 

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>
View Code

 

zwy

posted @ 2019-02-14 17:33  zwyk  阅读(66)  评论(0)    收藏  举报