Session应用笔记

Session是什么?

Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session

为什么要使用Session?

Session比Cookie使用方便,Session可以解决Cookie解决不了的事情【Session可以存储对象,Cookie只能存储字符串】。

Session常用API

long getCreationTime();//【获取Session被创建时间】

String getId();//【获取Session的id】

long getLastAccessedTime();//【返回Session最后活跃的时间】

ServletContext getServletContext();//【获取ServletContext对象】

void setMaxInactiveInterval(int var1);//【设置Session超时时间】

int getMaxInactiveInterval();//【获取Session超时时间】

Object getAttribute(String var1);//【获取Session属性】

Enumeration getAttributeNames();//【获取Session所有的属性名】

void setAttribute(String var1, Object var2);//【设置Session属性】

void removeAttribute(String var1);//【移除Session属性】

void invalidate();//【销毁该Session】

boolean isNew();//【该Session是否为新的】

Session使用

设置session(HttpServletRequest request

//得到Session对象
HttpSession session = request.getSession();
//设置Session属性
session.setAttribute("name","点赞");

获取session

//得到Session对象
HttpSession session = request.getSession();
//获取Session存进去的值
String value = (String)session.getAttribute("name");
System.out.println("session属性name的值:"+value);

一般来讲,当我们要存进的是用户级别的数据就用Session,那什么是用户级别呢?只要浏览器不关闭,希望数据还在,就使用Session来保存。

Session的生命周期和有效期

  1. Session在用户第一次访问服务器Servlet,jsp等动态资源就会被自动创建,Session对象保存在内存里,这也就为什么上面的例子可以直接使用request对象获取得到Session对象。
  2. 如果访问HTML,IMAGE等静态资源Session不会被创建。
  3. Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,无论是否对Session进行读写,服务器都会认为Session活跃了一次。
  4. 由于会有越来越多的用户访问服务器,因此Session也会越来越多。为了防止内存溢出,服务器会把长时间没有活跃的Session从内存中删除,这个时间也就是Session的超时时间。
  5. Session的超时时间默认是30分钟,有两种方式可以对Session的超时时间进行修改(如下)
//第一种java方式
//设置Session最长超时时间为60秒,这里的单位是秒
session.setMaxInactiveInterval(60);
//获得session的最大存活时间
Session.getMaxInactiveInterval();
//第二种方式xml方式
<session-config>
    <session-timeout>3600</session-timeout>
</session-config>

Session与Cookie的有效期是不同的

1:session周期指的是不活动的时间,如果我们设置session是10s,在10s内,没有访问session,session中属性失效,如果在9s的时候,你访问session,则重新计时
2:如果重启了tomcat,或者重启web应用,或者关机了, session也会失效 我们也可以通过函数让session失效,invalidate()该方法是让session中的所有属性失效,常常用于安全退出
3:如果你希望某个session属性失效,可以使用方法removeAttribute()
--------------------------区别------------------------------
4:cookie的生命周期就是按累计的时间来算的。不管用户有没有访问过

服务器是如何实现一个session为一个用户浏览器服务的?换个说法:为什么服务器能够为不同的用户浏览器提供不同session?

  1. HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同一个用户。
  2. 简单来说:Session 之所以可以识别不同的用户,依靠的就是Cookie
  3. 该Cookie是服务器自动颁发给浏览器的,不用我们手工创建的。该Cookie的maxAge值默认是-1,也就是说仅当前浏览器使用,不将该Cookie存在硬盘中

浏览器禁用了Cookie,Session还能用吗?

Session是依靠Cookie来识别用户浏览器的。如果我的用户浏览器禁用了Cookie了呢?绝大多数的手机浏览器都不支持Cookie,那我的Session怎么办?

1:我们知道当用户浏览器访问Servlet4的时候,服务器向用户浏览器颁发了一个Cookie,但是浏览器禁用了cookie,所以下次我们通过浏览器访问服务器的时候,浏览器是不会把Cookie带过去给服务器,所以Session好像不能用了
解决方案:URL地址重写

  1. HttpServletResponse类提供了两个URL地址重写的方法:
  2. (1):encodeURL(String url)
  3. (2):encodeRedirectURL(String url)

需要值得注意的是:这两个方法会自动判断该浏览器是否支持Cookie,如果支持Cookie,重写后的URL地址就不会带有jsessionid了【当然了,即使浏览器支持Cookie,第一次输出URL地址的时候还是会出现jsessionid(因为没有任何Cookie可带)】

response.sendRedirect(url);			//浏览器支持cookie
response.sendRedirect(response.encodeURL(url));	//浏览器不支持cookie,会自动在url后面加上JESSIONID=C473580E3653161E06666632C3531930用来识别同一个session

URL地址重写的原理:将Session的id信息重写到URL地址中。服务器解析重写后URL,获取Session的id。这样一来,即使浏览器禁用掉了Cookie,但Session的id通过服务器端传递,还是可以使用Session来记录用户的状态。

利用Session防止表单重复提交

重复提交的危害

注册多个用户, 表单重复提交,重复下单,不断发帖子,扰乱正常发帖秩序等。

常见的重复提交问题
1:网络延迟,多次点击提交按钮
2:在处理表单的Servlet中刷新、后退再提交

解决方案:
解决问题1:对于网络延迟造成的多次提交数据给服务器,其实是客户端的问题。于是,我们可以使用javaScript来防止这种情况

当我点击过一次提交按钮时,我就把提交的按钮隐藏起来或者用全局变量。不能让用户点击了!

<script type="text/javascript">
//定义一个全局变量
var flag = true;
//submit触发函数
function submit(){
	if(flag){
		//TODO 提交逻辑
		flag = false;
	}
}
</script>

解决问题2:当用户第一次点击提交按钮时,把数据提交给服务器。当用户再次点击提交按钮时,就不把数据提交给服务器了。
问题二不能只靠客户端来限制了。也就是说javaScript代码无法阻止这两种情况的发生。

1:在session域中存储一个token(后台通过一个单例生成随机数工具类生成)
2:然后前台页面的隐藏域获取得到这个token
3:在第一次访问的时候,我们就判断seesion有没有值,如果有就比对。对比正确后我们就处理请求,接着就把session存储的数据给删除了
4:等到再次访问的时候,我们session就没有值了,就不受理前台的请求了!

//后端代码
//RomdomUtil 自定义,根据自己的喜好
String token = RomdomUtil.getNumber();
request.getSession().setAttribute("token",token);
//TODO 跳转页面
//前端代码
<input type="hidden" name="token" value="${token}"/>
<script type="text/javascript">
//提交触发函数
function submit(){
	//条件1:判断隐藏域是否有值  条件2:判断session的token是否有值   条件3:判断隐藏域的值和session的token值是否相等
	if(条件1 && 条件2 && 条件3){
		reuqest.getSession().removeAttribute("token");
		//TODO 处理异步请求
	}else{
		alert("系统正在处理请求,请不要重复提交");
	}
}
</script>

一次性校验码

现在登录提交的验证码一般都不放在session里了,因为现在的项目大部分都是前后端分离、分布式。所以都是放在redis里,设置一分钟时效性,每次刷新页面后台都重新生成,且重置时效性,每次提交都先判断
1:redis是否存在(过期)
2:与redis里的值是否相等

Session和Cookie的区别

1:存储方式

  1. Cookie只能存储字符串,如果要存储非ASCII字符串还要对其编码。
  2. Session可以存储任何类型的数据,可以把Session看成是一个容器

2:安全性

  1. Cookie存储在浏览器中,对客户端是可见的。信息容易泄露出去。如果使用Cookie,最好将Cookie加密
  2. Session存储在服务器上,对客户端是透明的。不存在敏感信息泄露问题。

3:时效性

  1. Cookie保存在硬盘中,只需要设置maxAge属性为比较大的正整数,即使关闭浏览器,Cookie还是存在的
  2. Session的保存在服务器中,设置maxInactiveInterval属性值来确定Session的有效期。并且Session依赖于名为JSESSIONID的Cookie,该Cookie默认的maxAge属性为-1。如果关闭了浏览器,该Session虽然没有从服务器中消亡,但也就失效了。

4:对服务器的负担

  1. Session是保存在服务器的,每个用户都会产生一个Session,如果是并发访问的用户非常多,是不能使用Session的,Session会消耗大量的内存。
  2. Cookie是保存在客户端的。不占用服务器的资源。像baidu、Sina这样的大型网站,一般都是使用Cookie来进行会话跟踪。

5:浏览器禁用

  1. 如果浏览器禁用了Cookie,那么Cookie是无用的了!
  2. 如果浏览器禁用了Cookie,Session可以通过URL地址重写来进行会话跟踪。

6:跨域

  1. Cookie可以设置domain属性来实现跨域名
  2. Session只在当前的域名内有效,不可夸域名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值