博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Session和Cookie的区别及Session的生命周期
阅读量:4069 次
发布时间:2019-05-25

本文共 2403 字,大约阅读时间需要 8 分钟。

区别

1、cookie数据存放在客户的浏览器上,  

        session数据放在服务器上  
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗  
        考虑到安全应当使用session  
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能  
        考虑到减轻服务器性能方面,应当使用COOKIE  
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。  

5300个的限制我没听说

             为什么会有cookie呢,大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过   SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为    JSESSIONID的输出cookie,我们叫做session  cookie,以区别persistent   cookies,也就是我们通常所说的cookie,注意session   cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到sessionid=  KWJHUG6JJM65HS2K6之类的字符串。   
            明白了原理,我们就可以很容易的分辨出persistent   cookies和session   cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session   cookie针对某一次会话而言,会话结束session   cookie也就随着消失了,而persistent  cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如   session  cookie安全了。  
            通常session   cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent  cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session   cookie和persistent  cookie的结合我们就实现了跨窗口的session   tracking(会话跟踪)。  

            在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session  cookies位于服务器端,persistent   cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web   service了。

Session的生命周期:

我们已经知道,Session是在用户第一次访问网站的时候创建的,那么Session是什么时候销毁的呢?其实,Session使用一种平滑超时的技术来控制何时销毁Session。默认情况下,Session的超时时间(Timeout)是20分钟,即用户保持连续20分钟不访问网站,则Session被收回。如果在这20分钟内用户又访问了一次页面,那么20分钟就重新计时了。也就是说,这个超时是连续不访问的超时时间,而不是第一次访问后20分钟必过时。当然,你可以通过修改Web.config文件的配置项来调整这个超时时间,如下面的代码所示:

[html]
  1. <sessionState timeout="30"></sessionState>  
除了以上在web.config中设置session的有效时间之外,还可以直接程序中设置,如下面代码如所示:

 

[csharp]
  1. Session.Timeout = "30";  
Session.Timeout = "30";
以上设置session的有效时间为30分钟,一旦时间到期,则程序会自动重新分配一个新的sessionID。 不过,你可别太相信Session的Timeout属性,如果你把它设置为24小时,则很难相信24小时之后用户的Session还在。Session是否存在,不仅仅依赖于Timeout属性,以下的情况都可能引起 Session丢失:

1)bin目录中的文件被改写。asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失。

2)SessionID丢失或者无效。如果你在URL中存储SessionID,但是使用了绝对地址重定向网站导致URL中的SessionID丢失,那么原来的Session将失效。如果你在Cookie中存储SessionID,那么客户端禁用Cookie或者Cookie达到了IE中Cookie数量的限制(每个域20个),那么Session将无效。

3)如果使用InProc的Session,那么IIS重启将会丢失Session。同理,如果使用StateServer的 Session,服务器重新启动Session也会丢失。

以上是可能会引起session丢失的几个原因,有时候,我还需要立刻让Session失效。比如用户退出系统后,Session中保存的所有数据需要全部失效。处理方法如下面的代码所示:

[csharp]
  1. Session.Abandon();  
Session.Abandon();

转载地址:http://dgmji.baihongyu.com/

你可能感兴趣的文章
ZUUL2 使用场景
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
elastic-job 和springboot 集成干货
查看>>
php开发微服务注册到eureka中(使用sidecar)
查看>>
mybatis mybatis plus mybatis jpa hibernate spring data jpa比较
查看>>
支付宝生活号服务号 用户信息获取 oauth2 登录对接 springboot java
查看>>
CodeForces #196(Div. 2) 337D Book of Evil (树形dp)
查看>>
uva 12260 - Free Goodies (dp,贪心 | 好题)
查看>>
uva-1427 Parade (单调队列优化dp)
查看>>
【设计模式】学习笔记13:组合模式(Composite)
查看>>
hdu 1011 Starship Troopers (树形背包dp)
查看>>
hdu 1561 The more, The Better (树形背包dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>
Windows下安装ElasticSearch6.3.1以及ElasticSearch6.3.1的Head插件
查看>>
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>