Session解密
学习目的
为了理解与Session相关的常用方法函数,了解原理和作用
知识回顾
Cookie:小型文本文件,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据,通常经过加密。
正文
Session的作用
Session的作用,是记录一系列状态。
Session的定义
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
Session的工作原理
(1)当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,servlet从session仓库中加载已经存储的session变量。
(3)当执行servlet时,通过使用session_register()函数注册session变量。
(4)当servlet执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,下次浏览网页时可以加载使用。
Session的生命周期
新的浏览器窗口启动后,开始一个新的Session,触发Global的Session_Start的调用,从第一个浏览器窗口打开的浏览器窗口不启动新的Session。Session过期后,执行页面的提交也会触发Session_Start,等于是新的一个Session。
数据保存期
只要页面有提交活动,则Session的所有项都会保持,页面在20分钟(默认配置)内没有任何提交活动时Session会失效。Session内存储的多个数据项是整体失效的。
PHP中
PHP session变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
JSP中
Jsp的session是使用bean的一个生存期限,一般为page,session意思是在这个用户没有离开网站之前一直有效,如果无法判断用户何时离开,一般依据系统设定,tomcat中设定为30分钟。
使用session功能,可以达到多个jsp程序从操作同一个java bean,那么这个java bean可以作为传统意义上的"全局变量池".(在java中可以使用static静态化一个变量和方法,使用singleton独一化对象。
如何防止超时后删除数据
导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。
1、如果用户未操作的「长时间」超过了服务器配置的session超时时间,并导致session失效,那么我们延长session的超时时间,让用户原来的「长时间」与超时时间相比,变得不「长」,就可以解决了。
2、如果用户是长时间「未操作」导致session失效,那么想办法产生「操作」,让用户每隔一小段时间就「操作」一次,与服务器产生交互,那么session自然也不会失效。一般情况下下,我们首先想到的是,通过改变服务器的配置,延长服务器的session超时时间。例如,在Tomcat服务器的web.xml文件中有如下节点内容:
<session-config><session-timeout>30</session-timeout></session-config>
这里的30表示session的超时时间,单位为分钟,如果用户登录后在30分钟内没有与服务器交互,那么当前用户的session将失效。我们可以配置一个更大的数值(比如60),就可以延长session的超时时间,如果将该值改为0或负数的话,则表示session永不失效。
不过在实际的工作应用中,一味地上调session的超时时间设置并不怎么常见,大多数需要实现该功能的网站都将解决问题的焦点集中在第二条思路上。例如:一些在线网站均采用定时刷新页面的方法来防止session超时。
定时刷新页面,最常见的有两种实现方式:一种是通过JavaScript+HTMLDOM,另一种则是通过meta标签来实现。
1、JavaScript+HTMLDOM,示例代码如下:
functionrefresh(seconds){
setTimeout("self.location.reload()",seconds*1000);
}
refresh(600);//调用方法启动定时刷新,数值单位:秒。
2、通过meta标签来实现(在页面中添加meta标签refresh也可以指定每隔指定时间就刷新当前页面),示例代码如下:
<metahttp-equiv="refresh"content="600"/>
meta标签可以实现每过600秒就刷新一次当前页面。
(以上部分文字转自:https://baike.baidu.com/item/session/479100?fr=aladdin)
Session解析
Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。
当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session。
问题:如何知道浏览器和这个服务器中的session是一一对应的呢?又如何保证不会去访问其它的session呢?
原理解答:就是当访问一个页面的时候给浏览器创建一个独一无二的号码,也给同时创建的session赋予同样的号码。这样就可以在打开同一个网站的第二个页面时获取到第一个页面中session保留下来的对应信息(理解:当访问第二个页面时将号码同时传递到第二个页面。找到对应的session。)。这个号码也叫sessionID,session的ID号码,session的独一无二号码。
Session中的一些常用方法
isNew():是否是新的Session,一般在第一次访问的时候出现
getid():拿到session,获取ID
getCreationTime():当前session创建的时间
getLastAccessedTime():最近的一次访问这个session的时间。
getRrquestedSessionid: 跟随上个网页cookies或者URL传过来的session
isRequestedSessionIdFromCookie():是否通过Cookies传过来的
isRequestedSessionIdFromURL():是否通过重写URL传过来的
isRequestedSessionIdValid():是不是有效的sessionID
具体使用以及详细用法不做研究整理。