Cookie和Session是web开发中十分重要且容易被混淆的概念,总结记录如下。
1 什么是Session?
客户端与服务端交互通信的过程即是一次Session(会话)
2 Session何时创建?由谁创建?存储在哪里?
客户端与服务端成功连接后即开始创建;不同语言有不同创建Session的方法,具体到Java,tomcat通过调用HttpServletRequest
的getSession
方法进行session的创建工作;存储在服务端的内存中。
3 什么是sessionid?何时创建?存储在哪里?
session的key值,服务端可以根据sessionid获取session;在客户端与服务端第一次通信时,session创建时即被创建;创建之后,被传输到客户端,一般存储在cookie中。
4 为什么需要sessionid?
Http协议是无状态的,意思是断开链接之后它就不会再认识你了,除非你提供一个用户标识,所以sessionid出现了,客户端存储了sessionid之后,在下次访问服务器时会提交这个信息到服务端,服务端根据sessionid的值就能找到session,从而能够识别到你。
5 什么是cookie?
cookie是一些数据,以键值对形式存储,保存于电脑上的文本文件中,允许用户存储少量数据,空间只有4k,常常被用作用户账号密码的保存手段。
6 如何创建、删除、更新、查询cookie?
增加:
function addCookie(key, value, expires = 0) {
var cookieStr = key + "=" + escape(value)
if (expires > 0) {
var date = new Date()
date.setTime(date.getTime() + expires * 24 * 3600 * 1000)
cookieStr = cookieStr + "; expires" + date.toGMTString();
}
document.cookie = cookieStr;
}
删除:
function deleteCookie(key) {
var date = new Date();
date.setTime(date.getTime() - 10000);
document.cookie = key + "= over; expires=" + date.toGMTString();
}
**更新:**和增加一样
查询:
function getCookie(key) {
var cookies = document.cookie.split("; ");
var value = "";
for (var i = 0; i < cookies.length; i++) {
var arr = cookies[i].split("=")
if (key == arr[0]) {
value = unescape(arr[1])
break
}
}
return value
}
7 cookie与session什么关系?
session是服务端的概念,cookie是客户端的概念,本质上属于不同层次,只是在客户端识别上,session需要借助cookie保存sessionid,也仅此而已。
8 其余识别客户端的方法
url重写、input隐藏域等。
9 Java EE session登录校验流程
a. 第一次通信,tomcat生成session和sessionid,我们需要手动在session中保存用户登录状态,sessionid会被发送到客户端保存在cookie中;
b. 下一次通信,cookie中的sessionid被发送到服务端,tomcat即可解析出对应的session,这时我们手动get到的session即是解析成功的session,从而获取到其中的登录状态,用户即不需要重复登陆,反之如果session失效了,就需要跳转到登陆界面。
c. 登录校验过程往往在拦截器/过滤器实现。
如果在面试中被问到cookie和session的关系,我想主要回答以下几个方面:
- session是客户端与服务端交互通信的一种状态;
- 因为Http协议的无状态特性,所以为了使服务端能够识别客户端,需要sessionid唯一标识,从而能够使服务端通过sessionid获取session;
- cookie保存在客户端,在每次http请求均会发送到服务端;
- 因此可以使用cookie保存sessionid,这样每次http请求sessionid即被发送到服务端,服务端即可识别客户端了;
- session是服务端的概念,cookie是客户端的概念,本质上属于不同层次,只是在客户端识别上,session可以借助cookie保存sessionid,其它客户端识别方法还有url重写和input隐藏域等。
以上均本人理解,如有偏差,欢迎讨论。