javaEE011.02 Session简介 、表单重复提交的问题、session的默认存活时间30分钟

系列文章目录

前言/简介

接着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分钟.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值