图1
session的话,是将数据保存在服务端的,是服务端的会话跟踪技术。关于session的原理,其实session是基于cookies实现的。
假设服务端写了两个servlet,一个是servlet_a,一个是servlet_b。
此时在servlet_a中创建一个session对象,并对session对象赋值;然后在servlet_b中可以通过getAttribute的方法获取到servlet_a中的数据。
这就是session传输数据的基本过程,但是怎么保证servlet_a与servlet_b调用的是同一个session呢?
此处就用到了cookies,当servlet_a创建完session之后,会在给客户端响应的时候返回一个set-cookie的值,当下一次客户端发送请求到servlet_b的时候,会同时发生这个session的cookie值。从而保证servlet_a与servlet_b访问的是同一个session。这也是为什么说session是基于cookie的。
图2
session主要工作流程前面已经简单叙述过了,现在让我们来看一看具体的代码实现。主要用的方法如图2所示,具体代码如下图。
图3
这是创建的servlet demo1,具体在demo1中实现session的获取与数据的储存,其中需要注意的是,在给session里面储存数据时,使用的是键值对的数据类型,但value部分的数据类型不止是字符串类型,可以是任何类型,当我们查看此方法的源代码时(如图4)可以看到,value部分的数据类型是object。
图4
图5
在图3中我们创建好了session对象,这时我们在servlet-demo2中访问该数据,从而达到两个servlet之间数据的交流。可以将数据打印出来查看是否是同一个seesion的值。
图6
正常关闭重启:(下述内容为正常实验观察钝化与活化的过程)
在tomcat中用ctrl_c停止,依此输入(windows下)
cd ..
cd cookie-demo
mvn tomcat7:run(注意这里是用的你自己配置的tomcat的版本)
再访问用来创建session对象的servlet
ctrl c(等待一会儿)
出现提示,选择“Y”,终止操作。
tomcat命令行输入“mvn tomcat7:run(注意这里是用的你自己配置的tomcat的版本)”
注意:不用再次访问demo1.
结果可以看见session值还在。
————————————————————————————
这是因为在正常关闭之下,tomcat会执行tomcat的钝化与活化(如图6)并且再次活化时,存入文件的session值会在加载之后自动删除。
即!正常重启,session是不会丢失的(但还是有时间限制)
—————————————————————————————
还有一种情况:
demo1创建session1,然后关闭浏览器,再打开浏览器,demo2获取session2,此时的sessio1与session2就不是一样的了。因为关闭浏览器后,再次产生的会话就不是同一个会话了,因此cookie值代表的ID也就不一样了。
因此,若是需要共享session,通过session传递数据,那在需要的期间,浏览器都不能关闭。
即session是不能长期地储存数据的。
question:那直接关闭浏览器就不算是正常关闭了吗?
两种销毁方式,如图6所示。
图7
有如图7所示的5点。
关于安全性:因为cookie是将数据存储在客户端的,在发请求的时候会多次在客户端与服务端之间进行传递,然而传递就会容易被半路截住,而session就一直呆在服务端里,在家里总是比出门要安全的多的。
所以,根据他俩的区别,一般我们在运用的时候
购物车数据:C
账户信息:S
登录账号密码输入:C(确实需要安全性,但是session不能长时间记住嘛,那就给cooki里的数据加密吧)
验证码:S