系列文章目录
文章目录
前言/简介
接着cookie
由于cookie的不灵活
* Cookie缺陷
* Cookie的value为String型,不灵活。
* Cookie存放在浏览器中,不安全。
* Cookie过多,会浪费流量。
所以我们用session去弥补cookie的不足
- 类型:HttpSession
- 只是session是和服务器端去会话,跟cookie一样,只要浏览器不关不换,它就能运行
一、Session工作原理
打20折的故事
cookie是用发卡片盖戳的形式,而session呢?直接买一套会员系统,
客户来了直接报会员号,或者手机号就行了,就不需要小卡片了
* 请求
* 服务器创建Session,同时创建一个特殊的Cookie,该Cookie的key为固定值:JSESSIONID,(sessionId)
value为session的id。
* 服务器将该Cookie对象发送(响应)给客户端
* 以后客户端再请求时,会携带该Cookie对象。
* 服务器会根据Cookie的value,找到相应的Session,从而区分不同的给用户。
二、Session获取 (两种方式)
为什么只说获取,不说创建呢?因为是服务器创建的,我们只要获取就行了,不用管创建的问题
html没有隐含对象
jsp有隐含对象
所以:
* html(Servlet):request.getSession()
* jsp:直接获取(session是jsp中的隐含对象)
再新建一个jsp页面session_demo
我们先测试第一种使用方式:在jsp中直接使用
我们看到这个对象是16进制的 (比如这里的这个对象id它是全球唯一的)
为啥这就能获取到session呢,因为隐含就有这个对象
三、Session有效性
* 默认有效性:当前会话(因为特殊的Cookie是会话级别)
因为cookie是当前会话,不是找不到session,是找不到cookie
* 持久化Session
* 持久化特殊Cookie
* Session存活时间
* 默认存活时间为30分。
* 设置session的非活动时间
如果我们要改时间,就需要把它复制一下,放到自己的项目的web.xml下来
注意最小的单位就是分钟,如果我们想设置30秒怎么办,暂时是没有办法的,最小的单位就是分钟
* web.xml中
<session-config>
<session-timeout>30分钟</session-timeout>
</session-config>
* session.setMaxInactiveInterval(ss秒);
* ss>0:在ss秒后失效
* ss<=0:永不失效(Tomcat>=7)
* session立即失效
* session.invalidate();
所以session,不仅要设置特殊的cookie还要设置session的非活动时间
我们想一个问题,session是我们创建的吗
所以我们不能这样做
所以实际上我们一般用这种方式,而不是配置文件那种方式
四、Session钝化与活化
让session失效
新建一个jsp页面
再新建一个servlet
首先要它失效得先得到session
钝化与活化
* 钝化:将session对象及session对象中的数据,一同从内存中序列化到硬盘的过程称之为钝化。
* 时机:服务器关闭时触发
* 活化:将session对象及session对象中的数据,一同从硬盘反序列化到内存的过程称之为活化。
* 时机:服务器重启时触发
前面我们说域对象的时候就讨论过这个问题
session还在但是location不在了的问题
怎么测试呢
重启服务器(location就失效了)这个时候如果之前有session那就会造成这种情况,这是因为session的钝化
五、表单重复提交问题
有几几种情况会造成表单重复提交的问题?
- 转发,F5(细心观察的话会发现现在的浏览器都会提示你是否继续提交表单)
- 提交后,网速慢,连续点击提交按钮
- 提交后,点击回退按钮,继续提交
- 提交-Servlet-响应 0
* 思路:在Servlet中干预提交,第一次提交,以后不提交,问题就是我们在哪里去干预它呢
1. 使用UUID,作为Token。将Token存放到session域和隐藏域中。
* UUID:是一个全球唯一的32为的16进制的随机数。
2. 提交,判断变量是否为初始值
true:提交,移除session域中的Token(UUID)。
false:不提交
只要改变就行了,写个随机数也行,我们这里是去掉_
下面我们写一个测试表单重复提交的测试Demo:
下面写servlet
将Token存放到session域和隐藏域中
将Token存放到session域和隐藏域中
开始测试:
这时候还会提交吗?
不会了
隐藏域中虽然还有数据,但是隐藏域中已经没有数据了
总结
注意java中的session和.net中的session是稍微有些不同的
java中的session和.net中的session它们的效果虽然都相同,但是它们实际操作是不同的,.net中的session有它自己用session的独立方法,
而java也一样,这主要就是针对它们的开发工具了,java中的session默认过期时间为30分钟,.NET的为20分钟.