一、保存C/S间状态的两种方式
Session:(服务器端)
1)适合保存大量的数据
2)安全
3)效率高
4)Session跟踪机制中需要cookie来保存和传递sessionId
Cookie:(客户端)
1)不适合保存大量的数据。
2)不安全。
3)效率低。
二、Cookie
1)Cookie是服务器写在客户端本地的用来保存用户状态的一种机制。
2)为什么需要cookie?
客户端访问服务器,建立一个请求连接,如一个购买商品1的请求,则服务器会返回给客户端一个购买页面,然后服务器和客户端之间的连接就断掉了,这是因为HTTP协议具有无连接性。如果再去购买商品2,需要再访问服务器一次,相当于再次建立了新的连接。最后在结算的时候,服务器根本不知道客户端买了哪些东西。总结:
HTTP协议的无连接性要求出现一种保存C/S间状态的机制,这种机制就是cookies。
也就是说用户买一个商品,服务器把商品记录在客户端本地。
三、如何实现cookies:
1)服务器可以向客户端写内容。
2)只能是文本内容。(不能是一个可执行程序之类的数据,危及客户端安全)
3)客户端可以阻止服务器写入。
4)服务器A只能拿服务器A写入的内容,不能拿服务器B写入的内容。
总结:
cookies就是服务器写入到客户端的文本文件,与特定客户相关。
三、cookie的格式
cookies以“名-值”对的形式保存数据。
四、cookie的生命周期
举例:
package com.hpe.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/SetCookies")
public class SetCookies extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
for(int i=0; i<3; i++) {
//new了一个cookie
Cookie cookie = new Cookie("Session-Cookies-" + i, "Cookies-Value-S" + i);
//没有设置生命周期,只要窗口还开着,cookie就活着,窗口一关闭,cookie就没了
//将cookie写到客户端本地
resp.addCookie(cookie);
//new了一个cookie
cookie = new Cookie("Persistent-Cookies-" + i, "Cookies-P" + i);
//设置生命周期为3600秒
cookie.setMaxAge(3600);
//cookie被写到客户端本地,1小时后,文件就自动删除。
resp.addCookie(cookie);
}
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().println(
"<html>"
+ "<head>"
+ "<meta charset=\"UTF-8\">"
+ "<title>设置cookie</title>"
+ "</head>"
+ "<body bgcolor=\"#FDF5E6\" >"
+ "<h1 align=\"center\">"
+ "Setting Cookies"
+ "</h1>"
+ "There are six cookies associated with this page."
+ "To see them, visit the "
+ "<a href=\"ShowCookies\">"
+ "<code>ShowCokies</code> servlet"
+ "</a>."
+ "<p>"
+ "Three of the cookies are associated only with the "
+ "current session, while three are persistent."
+ "Quit the browser, restart, and return to the "
+ "<code>ShowCookies</code> servlet to verify that "
+ "the three long-lived ones persist across sessions."
+ "</p>"
+ "</body>"
+ "</html>"
);
}
}
总结:
①在服务器端,通过new Cookie()来创建一个cookie对象。
②在服务器端,通过cookie.setMaxAge()的方法来设置cookie的存活时间。
③在服务器端,通过resp.addCookie()来将指定cookie写入到客户端本地。
后面会去找本地的cookie文件,但别的浏览器的cookie存放位置不太好找,方便起见,使用IE浏览器来演示:
用IE浏览器访问SetCookies,页面效果:
点击超链接:
ShowCookies.java:
package com.hpe.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/ShowCookies")
public class ShowCookies extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.getWriter().println(
"<html>"
+ "<head>"
+ "<meta charset=\"UTF-8\">"
+ "<title>获取客户端</title>"
+ "</head>"
+ "<body bgcolor=\"#FDF5E6\" >"
+ "<h1 align=\"center\">Active Cookies</h1>"
+ "<table border=\"1\" align=\"center\">"
+ "<tr bgcolor=\"#FFAD00\">"
+ "<th>Cookies Name</th>"
+ "<th>Cookies Value</th>"
);
Cookie[] cookies = req.getCookies();
if(cookies != null) {
Cookie cookie;
for(int i=0; i<cookies.length; i++) {
cookie = cookies[i];
resp.getWriter().println(
"<tr><td>" + cookie.getName() + "</td>"
+ "<td>" + cookie.getValue() + "</td></tr>"
);
}
}
resp.getWriter().println(
"</table>"
+ "</body>"
+ "</html>"
);
}
}
总结:
①在服务器端,通过req.getCookies()来返回一个Cookie数组,即从客户端读取cookie对象。
②使用cookie的getName和getValue方法来获取cookie的名字和值。
cookie文件在哪里:
对于Win10环境下的IE浏览器,其cookies文件存放在C:\Users\{用户名,我的是fuchs}\AppData\Local\Microsoft\Windows\INetCookies目录下,会生成一个cookies文件:
其内容如下所示:
Persistent-Cookies-0
Cookies-Value-P0
localhost/TestServlet/
17408
292404096
30586699
2956596068
30586690
*
Persistent-Cookies-1
Cookies-Value-P1
localhost/TestServlet/
17408
292404096
30586699
2956621114
30586690
*
Persistent-Cookies-2
Cookies-Value-P2
localhost/TestServlet/
17408
292404096
30586699
2956641182
30586690
*
可以看到被设置了存活周期的3个Persistent-Cookies已经被写到了该文件中,还有3个没有被设置存活周期的Session-Cookies在哪儿呢?
这3个Session-Cookies保存在浏览器中,只要用户发出请求而生成的、未设置存活周期的cookie对象所在的这个窗口不关,该cookie就存在。
如果不去请求SetCookies,另外再开一个窗口,并直接访问ShowCookies,页面效果如下:
总结:
说明IE浏览器的多个窗口之间的cookie是共享的。
再开一个Chrome窗口:
总结:
说明浏览器不能访问其他浏览器的cookie。
总结:
①cookie分为两种,一种是通过cookie.setMaxAge(seconds)设置了存活周期的cookie,一种是没有设置存活周期的cookie。
②通过resp.addCookie(cookie)将创建的cookie对象放在客户端。
③设置了存活周期的cookie被存放在客户端的硬盘上以文件形式存储,存活周期一过,cookie文件不会自动删除,但cookie已经消失。
④没有设置存活周期的cookie被存放在浏览器窗口中,相当于存放在内存中,浏览器一旦关闭,cookie自动消失。
⑤cookie消失的意思是指:req.getCookies()来返回一个Cookie数组,该数组中找不到该cookie,即在服务器看来该cookie已经不存在,但存放在客户端的cookie文件依然存在。
⑤同一个浏览器的不同窗口之间的cookie是共享的,可以互相访问。
⑥不同浏览器之间的cookie不共享。