【JavaWeb开发】Session和Cookie的详解与关系

本文深入解析了HTTP协议中无状态特性带来的挑战,以及Cookie和Session如何解决这一问题,详细阐述了它们的定义、工作原理、使用方法及生命周期,帮助读者理解在Web开发中如何有效地管理和维护用户状态。

1.为什么要出现cookie和session?

“众所周知”,HTTP协议是无状态的。什么叫无状态呢?就是每一次客户端向服务器进行请求访问,服务器都不认识你,认为你是个刚出生的小婴儿。
这就好比法制社会出现的无身份证的人,你没法证明你是你自己,你爸是你爸。
这怎么能行呢?所以cookiesession就来帮忙了,给你一个身份证,让服务器方便快捷的认识你。

2.什么是Cookie和Session?

2.1 Cookie

Cookie的定义

cookie是服务端给客户端的数据,数据存储于客户端(浏览器)。

因为是保存在客户端上的,所以存在安全问题,并且cookie是有个数和大小限制的(4KB),所以一般cookie用来存储一些比较小且安全性要求不高的数据,而且一般数据都会进行加密

比如我们登录优快云,把咱们的账号密码输入一次成功了,把浏览器一关,再打开去官网一看,是不是已经记住了你的登录状态。这是cookie的功劳。

Cookie常用方法

创建一个Cookie

Cookie cookie = new Cookie("account", "i am cookie");//左边参数为cookie名,右边参数为cookie值

设置此cookie的存储在浏览器的有效时长(单位为s)不设置默认为-1,表示关闭浏览器即结束生命

cookie.setMaxAge(1*60*60*24);//24小时失效

设置在某个域名下生效

cookie.setDomain("localhost");//默认为localhost

设置访问该域名下某个路径时生效

cookie.setPath("/");//默认为 / ,即该工程都可访问

添加到response

response.addCookie(cookie);

获取cookies

Cookie[] cookies=request.getCookies();

cookies内的值拿出,通过判断cookie的名字拿到值

//cookie内的值拿出
String lastTime=null;
//不为空则读出来
if (cookies!=null && cookies.length>0){
	for(Cookie cookieNew:cookies){
		String cookieRequestName=cookieNew.getName();
		if ("lastTime".equals(cookieRequestName)){
			lastTime=cookieNew.getValue();
			break;
		}
	}
}

Cookie生命周期

Cookie的生命周期即是设置setMaxAge()这个属性,默认为-1,也就是关闭浏览器cookie就消亡了,这个叫做会话cookie
而如果设置了具体时长,会在这个时间过后自动消亡。

Cookie可能出现的问题

cookie可能出现的问题请看本人另一篇博文:Cookie在浏览器中的问题

2.2 Session

Session的定义

Session服务端或者jsp的一个对象,它存储在服务器端,会给客户端页面传递一个SessionID标识。默认名为JSESSIONID(java session id)

我们知道session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保存当前用户的状态信息。如果一个请求进入了JSP页面且它本身没有session,会自动创建一个sessionsession不能算是一个新技术,它是基于cookie的一种机制。

Session机制session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候session也用来指这种解决方案的存储结构。

session生命周期在客户端看来就像是关掉浏览器即生命结束,其实不是这样的表面现象,下方会讲解。

详细来说:

  • 当一个Session开始时,Servlet容器会创建一个HttpSession对象,那么在HttpSession对象中,可以存放用户状态的信息

  • Servlet容器为HttpSession对象分配一个唯一标识符即SessionId,Servlet容器把SessionId作为一种Cookie保存在客户端的浏览器

  • 用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出SessionId,然后根据这个SessionId找到相应的HttpSession对象,从而获取用户的状态信息

Session的常用方法

获取session,没有则创建

HttpSession session = request.getSession();

获取SessionId

session.getId()

获取存储的某个值

session.getAttribute("key");

存储数据,value是object类型

session.setAttribute("key","value");

设置会话的超时时间(单位:秒),默认30分钟

session.setMaxInactiveInterval(1*60*60);

获取session创建的时间

session.getCreationTime();

获取最后一次修改session的时间

session.getLastAccessedTime()

移除某个数据

session.removeAttribute("key");

重置session,使session失效

session.invalidate();

Session的生命周期

在客户端看来,session的生命周期在于有没有关闭这个浏览器。访问了服务器的servlet,会返回给你的页面一个sessionIdcookie,当你关闭浏览器后,sessionId这个cookie就没了,那么是不是代表session已经消亡了呢?

我们知道Session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送任何请求来关闭Session,自然Session也不会被销毁,但是可以做一点努力,在所有的客户端页面里使用js的window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法就是不去管它,让它等到默认的时间后,自动销毁。

那么为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?

其实Session一直存储在服务器端,而当我们关闭浏览器时,存储的sessionIdCookie是存在于浏览器的进程中的,当浏览器关闭时,sessionIdCookie也就不存在了。

什么意思呢?

实际上这个存储着sessionIdcookie,它的生命时间设置的是-1,即关闭浏览器结束生命,也就是一个会话cookie
关闭浏览器后,这个会话cookie的生命结束了,但本身存储在服务器的session还是存在的,但它没有再触发的机会了。

也就是说一个session会给一个拥有SessionId会话Cookie存在于浏览器的进程中,当我们关闭并重新打开浏览器窗口时,之前的会话Cookie已经消亡,此时服务器从HttpServletRequest对象中没有检查到记载sessionid会话cookie,服务器会再发送一个新的存有Sessionid会话Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上原先的session等到它的默认时间到之后,便会自动销毁。

注意:session在服务器中的消亡倒计时是在你没有对浏览器页面做任何操作开始,一旦又开始向服务器进行请求,session消亡倒计时将重置。而想在浏览器或者服务器直接消亡session的生命,可以使用session.invalidate();

3.Session和Cookie的关系

综上所述:

  1. cookie是服务端给客户端的数据,存储于客户端(浏览器)。
    Session也是服务端给客户端的数据,是存储在服务器端,它是基于cookie的一种运用机制。

  2. cookie的安全性不高,总存储量也只有4kb,需要对数据进行加密,站点可能限制最多cookie数。
    session的安全性较高,总存储量很高,由于数据存储在服务器中,无需加密,但对一个网页来说具有唯一性。

  3. session通过服务器向浏览器发送一个具有SessionId会话cookie来给用户一个身份标识,在浏览器没有关闭的情况下,会话cookie(Sessionid)一直存在,服务器中session的数据也一直存在。一旦浏览器关闭,浏览器的会话cookie(Sessionid)会消亡,但服务器中的session仍然存在,只有消亡倒计时结束或者调用了session.invalidate();服务器中的session才会消亡。

  4. 可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

综合成一个表格 :

区别CookieSession
定义 Cookie是客户端技术,保存在客户端,即本地。因为Cookie在客户端所以可以编辑伪造的,并不是十分安全Session是服务器端技术,保存在服务端,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,用户在浏览器不关闭的情况下可以一直保持方便快捷的与服务器进行交互
存储数据只能存储 String 类型的对象(中文或者空格需要转码)能够存储任意的 java 对象
性能Cookie存在客户端对服务器没影响Session过多时会消耗服务器资源,大型网站会有专门Session服务器
作用域Cookie通过设置指定作用域只能在指定作用域有效Session在整个网页都有效
作用时间Cookie可以通过setMaxAge()设置有效时间,即使浏览器关闭了仍然存在关闭网页Session就结束了

参考文档:
JavaWeb Session详解
浏览器关闭后,Session会话结束了么?
Java Web之Cookie和Session详解
Java中Cookie的使用(Cookie 和Session的区别)

以上就是全部内容,如果对你有所帮助,请点个赞支持一下作者~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值