概念
关于Cookie和Session,我想有人还处于对它们迷迷糊糊的状态,今天我们就狠狠的区别它。
首先介绍一下它们是干嘛的,也就是它们的共同点。
我们知道的,http
是一个无状态的协议,在通信过程中,通信的双方不会在通信的上下文中保存任何信息。这意味着每次通信都是独立的,不依赖于之前的通信状态。
欸欸欸!那就可麻烦了。那类似购物的话,岂不是每次去淘宝买东西,我都得登录一下?
不是,Cookie和Session的作用就是为了给我们减少麻烦,保存我们的信息,避免我们下次购买商品时还要登录。
Cookie
想象一下你去了一家咖啡店,当你第一次去的时候,店员会给你一个小卡片,这个卡片上记录了你的一些基本信息,比如你最喜欢的咖啡口味,或者你上次买的咖啡的数量。这张小卡片就相当于是一个Cookie。
当你下次再去这家咖啡店的时候,店员不需要再问你:“请问您想要什么口味的咖啡?”因为他们看到你的卡片就知道了。他们会直接为你准备你最喜欢的咖啡口味。在这个场景中,卡片(也就是Cookie)就帮助咖啡店“记住”了你的喜好。
同样地,当你在网上浏览网页时,很多网站也会使用类似的小卡片(Cookie)来“记住”你。比如,你登录了一个网站,网站会给你一个Cookie,这个Cookie里包含了你的登录信息。下次你再访问这个网站时,网站就能通过读取这个Cookie知道你已经登录过了,然后就可以直接为你展示你的个人信息或者让你进入会员区域。
Cookie相关知识点
- cookie是在浏览器中保存的。
- 如果想要使用cookie要保证我们的浏览器是开启cookie,所以说有一定的弊端,如果浏览器没有开启cookie,就不能再使用cookie了。
- cookie的大小是有限制的,通常是
4096byte
- cookie的保存是以键值对的形式存在的
Cookie常用语法
//1.cookie的构造方法,目的是实例化出来cookie对象
Cookie(String key,String value)
//2.设置cookie的方法
setValue(String value) //插入或修改cookie的值
getValue(String value) //获得cookie的值
getName(String value) //获得cookie的键
setMaxAge(int time) //设置cookie的有效时间
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);
//4.获得所有cookie
request.getCookies();
例1:设置Cookie值
public class SetCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws Exception {
/**
* 1.创建cookie对象
* 将
* 键:msg
* 值:sb ,存到cookie对象中
*/
Cookie cookie = new Cookie("msg", "sb");
/**
* 2.设置有效时间
* 正数:表示当前cookie的有效时间
* 负数:表示当前浏览器打开的时候存在,关闭的时候没了
* 0:销毁当前的cookie
*/
cookie.setMaxAge(60*60*24);//设置了有效期是个正数,
//3.把cookie发送到浏览器
response.addCookie(cookie);
}
}
例2:获取Cookie值
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//获取浏览器中cookie,返回值是一个数组
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println("==============");
System.out.println(cookie.getName());//获取键
System.out.println(cookie.getValue());//获取值
}
}
例:销毁Cookie值
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//退出登录
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("msg")){
cookie.setMaxAge(0);//销毁cookie
//重新发送给浏览器
response.addCookie(cookie);
}
}
}
Session
从上面了解到了Cookie的用法,接下来我们了解一下Session。在这之前,我想有人一直有个疑问,Session和Cookie都是浏览器用于保存信息的,有了Cookie为什么还要用Session?
它们是有区别的,而且用途不一样:
-
存储位置
-
存储容量
- Cookie:单个cookie保存的数据通常不超过4KB,一个站点最多可以保存20个Cookie。
- Session:对于session来说并没有明确的容量上限,但出于服务器性能考虑,不建议在session中存放过多的数据。
-
存储内容
- Cookie:主要存储的是一些简单的文本信息,如用户名、密码的加密串等。
- Session:由于存储在服务器上,可以存储更复杂的数据结构,如用户信息、登录状态、浏览历史等。
-
安全性
- Cookie:对客户端是可见的,可以被用户或恶意软件读取和篡改,因此存在一定的安全风险。
- Session:存储在服务器上,对客户端是透明的,相对更安全。但如果服务器存在安全漏洞,Session也可能被窃取。
-
有效期
- Cookie:可以通过设置maxAge属性来控制过期时间,可以长期有效。
- Session:依赖于名为
JSESSIONID
的cookie,这个cookie的过期时间默认为-1,即浏览器关闭窗口后session就失效。但也可以通过服务器设置来延长session的有效期。
-
服务器压力
- Cookie:不占用服务器资源,对服务器压力小。
- Session:每个用户都会产生一个session,如果并发访问的用户很多,会消耗大量的服务器资源。
-
浏览器支持
- Cookie:需要客户端浏览器的支持,如果浏览器禁用了cookie或不支持cookie,会话跟踪会失效。
- Session:不依赖于浏览器对cookie的支持,但如果浏览器不支持cookie,则需要使用URL地址重写等方式来传递session id。
-
跨域支持
- Cookie:支持跨域名访问。
- Session:仅在他所在的域名内有效,不支持跨域名访问。
Session常用语法
没有大小的限制
信息的保存也是以键值对的形式存在的
request.getSession(); //返回HttpSession
setAttribute(key,value); //设置属性 key ,value
getAttribute(key); //获取key的值
removeAttribute(String key) //通过key值删除数据
invalidate(); //将session中的变量全部清空
setMaxInactiveInterval(int interval); //设置session失效时间,单位为秒
getMaxInactiveInterval();//获取session失效时间
getId(); //获取sessionID
例1:设置Session
public class SetSessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response){
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//1.获取session对象
HttpSession session = request.getSession();
System.out.println(session);
//获取的是JSESSIONID 服务器唯一的标识
System.out.println(session.getId());
//给session设置一个时间,有效果的,里面放的是秒
session.setMaxInactiveInterval(60*60*24);
User user = new User();
user.setUsername("Kitty");
user.setBirthday(new Date());
user.setSex("1");
session.setAttribute("user",user);
}
例2:获取Session
public class GetSessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response){
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//1.获取Session对象
//第一次创建session的时候默认为true
//false的话,这个session使用的是已经创建好的session对象
HttpSession session = request.getSession(false);
//2.获取session,通过键取值
Object user = session.getAttribute("user");
System.out.println(user);
}
例3:清空Session
public class DestroySessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//1.获取session对象
HttpSession session = request.getSession();
//销毁当前的session
session.invalidate();
}