cookie和session是前端学习中出现频率非常高的问题,之前也有接触,今天就来整理一下
cookie
工作原理
由于http是无状态的协议,服务器单从网络连接上无法知道客户身份,那怎么办呢,给每个客户发一个通行证吧,访问服务器时带着自己的通行证,就可以确认身份啦
cookie实际上就是一段文本信息,可以理解为http的扩展,是一种客户端存储的方式,cookie是如何在服务器和浏览器之间工作的呢
1.客户端向服务器发送请求
2.服务器发送一个http
响应到客户端,其中包含set-cookie
头部
3.客户端发送一个http
请求到服务器,其中包含cookie
头部
4.服务器发送一个http
响应给客户端
![](https://img.haomeiwen.com/i3114127/29b157eebecaefeb.png)
服务器端设置cookie
var http = require('http');
var fs = require('fs');
http.createServer(function(req, res) {
res.setHeader('status', '200 OK');
res.setHeader('Set-Cookie', 'isVisit=true;domain=.yourdomain.com;path=/;max-age=1000');
res.write('Hello World');
res.end();
}).listen(8888);
console.log('running localhost:8888')
客户端浏览器设置cookie
直接用js设置cookie
document.cookie = "name=Jonh; ";
cookie属性
-
String name
:该Cookie的名称。 -
Object value
:该Cookie的值。 -
int maxAge
:该Cookie失效的时间,单位秒.如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1。 -
boolean secure
:该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。 -
String path
:该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。 -
String domain
:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。 -
String comment
:该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明。
int version
:该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范。
对cookie的常见操作
cookie中没有直接删除和修改的方法,可通过下边的方式进行操作
- 删除:将
maxAge
设置为0 - 修改:重新设置一个同名的
cookie
cookie跨域
Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。
正常情况下,同一个一级域名下的两个二级域名www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数,例如:
Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setDomain(".helloweenvsfei.com"); // 设置域名
cookie.setPath("/"); // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期
response.addCookie(cookie); // 输出到客户端
Session
Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力
为了有更高的速度,服务器一般把session放在内存中,每个用户都有一个独立的session
虽然session是保存在服务器的,看似和客户端无关更和cookie无关,但实际上,session的工作是依赖cookie的,这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。该cookie的maxAge一般为负数,浏览器关闭即失效
session的工作步骤
1.服务器端的产生Session ID
2.服务器端和客户端存储Session ID
3.从HTTP Header中提取Session ID
4.根据Session ID从服务器端的Hash中获取请求者身份信息
当浏览器禁用cookie时,session要如何正常工作呢,那就是url地址重写
url地址重写
URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态,HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写
cookie和session区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上;
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
网友评论