Cookie的机制

Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能。

Cookie的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的;Cookie的Expires属性标识了Cookie的有 效时间,当Cookie的有效时间过了之后,这些数据就被自动删除了。

如果不设置过期时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览会话期的 Cookie被称为会话Cookie。会话Cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把Cookie保存到硬盘 上,关闭后再次打开浏览器,这些Cookie依然有效直到超过设定的过期时间。存储在硬盘上的Cookie可以在不同的浏览器进程间共享,比如两个IE窗 口。而对于保存在内存的Cookie,不同的浏览器有不同的处理方式。(设置age为负数就是窗口cookie,设置0删除cookie,设置正数存活的时间)

Session的机制

Session是存放在服务器端的类似于HashTable结构(每一种Web开发技术的实现可能不一样,下文直接称之为HashTable)来存放用户 数据,当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

一般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable。在销毁之前,程序员可以 将用户的一些数据以Key和Value的形式暂时存放在这个HashTable中。当然,也有使用数据库将这个HashTable序列化后保存起来的,这 样的好处是没了时间的限制,坏处是随着时间的增加,这个数据库会急速膨胀,特别是访问量增加的时候。一般还是采取前一种方式,以减轻服务器压力。

以上复制于:http://www.cnblogs.com/aspnet_csharp/archive/2012/10/18/2729609.html

1:使用Cookie保存登录状态

场景:当我们登录新浪微博之后,过了2天没有在登陆的话,第三天你打开微博发现依旧不用登录(这里说的是浏览器访问微博,不是客户端)。一般不是很了解http的新人可能以为是服务器端session的存活时间设置的足够长!!其实可以如果要是了解session跨窗口共享的原理你就会发现肯定不是把session设置足够长存活时间实现的(可以参考下面2)。而且服务器端session存活时间设置太长的话会导致常见大量session存于内容,会导致内存占用量过高,更不符合实际需求。

所以针对这个问题,一般解决方案就是使用cookie,在本地保存一个登录状态(可以设置cookie的存活时间,也就是设置用户免密码登录的有效时间),每一个请求的时候携带上cookie,在后台通过判断cookie的登录状态进行处理是否登录成功。当cookie保存的用户登录状态失效之后就需要我们输入用户名和密码手动点击登录了。

2:session如何实现跨窗口的?

因为每一个会话有一个sessionId。该SessionId是在浏览器本地的cookie中存储的,而每一个SessionId的过期时间是浏览会话结束时。所以只要当前浏览器窗口没有关闭,该sessionId依旧是存活的。由于cookie是被同一个浏览器多个进程共享的,所以当你新打开一个浏览器进行访问的时候(双击图标打开浏览器,也可以是新建tab),在访问你上次访问的网站,还可以直接登录,无需手动输入密码点击登录。这其中的原理就是:由于上一个登录的窗口没有关闭导致其sessionid在cookie中依旧是存活的,然后第二个浏览器访问时候共享该cookie中的同一个sessionId,共享一个sessionId在服务器端的效果就是共享一个session会话,由于服务器端的session中保存了你的登录状态,所以你可以直接登录,无需输入密码,这就是session可以跨窗口分享的原因(cookie存储sessionid供分享)。

拓展:

我们也可以模拟cookie的实现原理,将状态使用数据库,Redis等存储工具保存状态。

session、cookie 记住登录状态的实现的更多相关文章

  1. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

    首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段   本实例采用vs2010编写 ...

  2. Django(十三)状态保持 —— cookie与session+ajax异步请求+session记住登录状态+cookie记住登录名密码

    一.状态保持的概述 http协议是无状态的.下一次去访问一个页面时并不知道上一次对这个页面做了什么.因此引入了cookie.session两种方式来配合解决此问题. Duplicate entry:重 ...

  3. 使用Cookie记住登录用户

    在登录表单中,写入: 记住我: <select name="cookie">       <option value="0" selected ...

  4. 登录成功后如何利用cookie保持登录状态

    Cookie是一种服务器发送给浏览器的一组数据,用于浏览器跟踪用户,并访问服务器时保持登录状态等功能. 通常用户登录的时候,服务器根据用户名和密码在服务器数据库中校验该用户是否正确,校验正确后则可以根 ...

  5. 【wpf WebBrowser 清空网站的Cookie&Session 清空用户登录状态】

    最近做项目遇到了一个说小不小,说大不大的问题,那就是在WebBrowser中清空网站上用户的登陆状态, 一开始心想,那不就清空cookies就行啦,那么简单的事情,百度一下 …… …… 是的,正如你们 ...

  6. servlet方式通过Cookie记住登录时的用户名和密码

    1.建立web工程 2.创建存放servlet的包 3右键包,新建servlet,路径将前面的servlet去掉,只需要doPost和doGet方法 编写servlet CookieServlet.j ...

  7. iOS关于Cookie验证登录状态

    1.第一次进入应用,登录获取Cookie,此时如果用到的是AFN去获取接口数据,Cookie已经写入了,所以无需处理,每次请求的时候,会自动将该cookie传给后台去验证 2.将Cookie缓存到本地 ...

  8. session + cookie 实现登录功能

    前端部分代码实现 <div id="mainCp"> <div class="postForm"> <p> <labe ...

  9. 基于cookie的用户登录状态管理

    cookie是什么 先来花5分钟看完这篇文章:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies 看完上文,相信大家对cookie已经有 ...

随机推荐

  1. Django学习(5)优雅地分页展示网页

    在我们平时浏览网页时,经常会遇到网页里条目很多的情形,这时就会用到分页展示的功能.那么,在Django中,是如何实现网页分类的功能的呢?答案是Paginator类. 本次分享讲具体展示如何利用Djan ...

  2. EF SaveChanges() 报错(转载)

    最佳答案 报这个错是因为,提交了主键重复的数据,虽然未提交到数据库中 但是现在的EF上下文中已经包含了我提交的数据,下次在提交正确数据时, 原来添加到上下文中的数据依然还在..如何处理这个问题呢?   ...

  3. C#.net使用DotNetCharting控件生成报表统计图

    在做项目时要对数据进行统计分析,所以必须生成一些报表统计图(如柱形图.饼图.曲线图等),网上强烈推荐了使用DotNetCharting控件来实现,于是自己对DotNetCharting控件进行了简单的 ...

  4. EXISTS 执行顺序

    select * from a where a.s_status=1 and exists (select orderid from b where a.orderid=b.orderid) exis ...

  5. MVC之Ajax异步操作

    在页面的局部通过Html.Action加载一块分布页,我们可以通过Ajax异步去更换或更新这块分布页 通过一个下拉框值发生变化的时候,我们会去从后台重新访问这个action获取一个新的View,然后替 ...

  6. Java使用foreach语句对数组成员遍历输出

    /** * 本程序使用foreach语句对数组成员进行遍历输出 * @author Lei * @version 2018-7-23 */ public class ForeachDemo { pub ...

  7. matlab中常数下的点是什么意思

    加上点"."后表示两个矩阵或向量对应位置进行运算, 这时候要求进行操作的两个变量必须维数相同(与矩阵乘法对矩阵维数要求不同)

  8. InheritParasitic.js

    // 寄生式继承 // 其基本思路是类似创建对象时的工厂模式,将继承过程封装在一个函数里,然后返回一个对象 function createObject(o){ var clone = Object.c ...

  9. 浮动布局float

    浮动 浮动是css里面布局用的最多的属性. .box1{                      float: left;                      width: 300px;    ...

  10. 测试思想-集成测试 关于接口测试 Part 2

     关于接口测试 by:授客 QQ:1033553122 ------------------接Part 1---------------------- 5.   用例设计思想(举例说明) 如上表,是某 ...