Web 开发需要知道的知识(二)

1. Session 与 Cookie

先有鸡还是先有蛋呢?在这里其实是先有Session 的。当程序需要为某个客户端的请求创建一个回话的时候, 服务器首先检查这个客户端的请求里是否已包含了一个回话标识 -JSESSIONID, 如果已包含一个 JSESSIONID

  • 服务器就按照 JSESSIONID 判断是否以前已经为此客户端创建过回话。
  • 如果客户端请求不包含JSESSIONID, 则为此客户端创建一个回话并且生成一个与此 回话 相关联的JSESSIONID。这个JSESSIONID将被在本次响应中返回给客户端保存。[响应报文中多了一个Set-Cookie 字段]

由于http的无状态性,为了使某个域名下(敲黑板…)的所有网页能够共享某些数据,session和cookie组合套餐出现了。客户端访问服务器的流程如下:
在这里插入图片描述

  • 首先,客户端会发送一个http请求到服务器端。
  • 服务器端接受客户端请求后,建立一个session,并发送一个http响应到客户端,这个响应头,其中就包含Set-Cookie头部。该头部包含了sessionId。
  • 在客户端发起的第二次请求,假如服务器给了set-Cookie,浏览器会自动在请求头中添加cookie
  • 服务器接收请求,分解cookie,验证信息,核对成功后返回response给客户端

因此说cookie只是实现session的其中一种方案。虽然是最常用的,但并不是唯一的方法。禁用cookie后还有其他方法存储,比如放在url中。

2. Cookie高阶知识点
2.1 cookie 路径

cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置。
通常web 开发中:
Cookie cookie = new Cookie(sessionCookieKey, sessionId);
cookie.setPath(request.getContextPath());
cookie.setMaxAge(Hours * 3600);//以秒为单位,不设置会话结束后就会消失
response.addCookie(cookie);

2.2 cookie域

路径能解决在同一个域下访问 cookie 的问题,那么如何解决同一个主域下的访问问题呢?我们可以通过指定可访问cookie的主机名来进行设置。

例如 “www.baidu.com” 与 “mp3.baidu.com” 公用一个关联的域名"baidu.com",我们如果想让 “www.baidu.com” 下的cookie被 “mp3.baidu.com” 访问,我们就需要用到 cookie 的domain属性,并且需要把path属性设置为 “/”

这里需要注意一点:一定的是同域之间的访问,不能把domain的值设置成非主域的域名。
默认cookie的域是当前域名,默认的路径的设置cookie时的当前页面的目录路径。如果想要跨域或者在其他的路径下访问cookie就必须要重新设置这两个属性,domain和path。

2.3 cookie生命周期

setMaxAge()方法便可以设置Cookie对象的有效时间
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。

如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

cookie.setmaxage设置为0时,会马上在浏览器上删除指定的cookie
cookie.setmaxage设置为-1时,代表关闭当前浏览器即失效。

3. 实例-通过Cookie、Session实现用户登录
当用户登录成功时:

1.设置Attribute:{SessionID,UserInfo}…我们随机生成一个序列号作为key(SessionID),将用户信息作为value(UserInfo).以键值对的形式存放在中间件中(由于服务通常是分布式部署,不建议存放在当前服务器中,此外还可以进一步设置过期时间)

2.设置cookie:{sessionCookieKey,SessionID}… 我们生成cookie信息,key(sessionCookieKey)预先定义好字符串,value(SessionID)为步骤1中服务端生成的序号。

当用户发送请求时

3.通过传递过来的Cookie ,我们通过key 值取出其中的value; 根据value去第三方中间件查找用户信息,查找成功表明该用户以及登录,查找失败表示登录过期或则未登录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值