Cookie和Session及其工作原理

学习笔记
参考动力节点JavaWeb教程

**

Cookie

**是一种进行网络会话状态跟踪的技术(属于Web开发技术)。会话是由一组请求与响应组成,是围绕一件相关事情所进行的请求与响应,所以这些请求与响应之间一定是需要有数据传递的,而http协议是一种无状态协议,在不同请求间不能完成数据传递,所以需要这种会话状态跟踪技术。
Cookie是由服务器生成(将其封装在响应头中,以响应的形式发送给客户端),保存在客户端的一种信息载体,这个载体中存放着用户访问该站点的会话状态信息,只要cookie没被清除,或没失效,保存的会话状态信息就会一直有效,当客户端再次发送同类请求时,请求会携带保存的Cookie数据,发送到服务器,由服务器对会话进行跟踪。

Cookie是由若干键值对构成,这里的键一般称为name,值为value。Cookie中的键值对均为字符串。

**

有关Cookie的方法:

**

//创建Cookie,调用Cookie的带参构造器
Cookie cookie=new Cookie("address","shanghai");

//指定Cookie绑定的路径。(该路径必须要添加上项目名称)
cookie.setPath(request.getContextPath()+"/aaa/bb/ccc");

//设置Cookie的有效期,该值为整型值,单位为秒
cookie.setMaxAge(60*60);//该值大于0,表示将Cookie存放到客户端的硬盘;小于0,与不设置效果相同,会将Cookie存放到浏览器的缓存;等于0,表示Cookie医生称便失效。

//向响应中添加Cookie
response.setCookie(cookie);

**

Session

**
是Web开发中的一种会话状态跟踪技术。与Cookie的不同之处,Cookie是将会话状态保存在了客户端,而Session是将会话状态保存到了服务器端。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象形式出现的。

**

会话:当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。

**

**

有关Session的用法:

**

/*
	对于request的getSession()的用法:
	一般情况下,若想session中写入数据,需使用个体Session(true),即getSession()方法。    
	意义:有老的用老的,没老的建新的。
	
	若要从Session中读取数据,则要使用getSession(false)。
	意义:有老的用老的,没老的返回null
*/

**

Session的工作原理

**

(1)写入Session列表
服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为列表,该Map的key为一个32位长度的随机串,这个随机串称为JSessionID,value则为Session对象的引用。
当第一次提交请求时,服务端servlet中执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。
(2)服务器生成并发送Cookie
在将Session信息写入到Session 列表后,系统还会自动将“JSessionID”作为name,这个32位长度的随机串作为value,以Cookie的形式存放到响应头中,并随着响应,将该Cookie发送到客户端。
(3)客户端接收并发送Cookie
客户端接收到这个Cookie后会将存放到浏览器的缓存中。当用户端提交第二次请求时,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务器。

Session失效是指某个Session在指定时间内一直没有被访问,超时后就会失效。
在web.xml中可以通过<session-config标签设置Session的超时时间(单位分钟),默认为30分钟,该时间指从最后一次被访问开始计时,在指定时长内一直未被访问的时长。

<!--设置Session的失效时间-->
<session-config>
	<session-timeout>60<session-timeout>
</session-config>
//使Session失效,但失效的Session并不为null
session.invalidate();

A,解决Cookie禁用后(不禁也能用),Session的跟踪问题
比如:从SomeServlet.java重定向跳转到OtherServlet.java时:

	String uri=request.getContextPath()+"/otherServlet";
	uri=response.encodeRedirectURL(uri);//将重新编码后的uri给uri
	response.sendRedirect(uri);

但该种方式会重写URL,会将JSessionID写到地址栏,不安全

B,解决Cookie禁用后,非重定向时的Session跟踪问题
比如:从SomeServlet.java通过标准输出流输出的超链接跳转到OtherServlet.java时:

	response.setContentType("text/html;charset=utf-8");
	//获取标准输出流
	PrintWriter out=response.getWriter();
	String uri="otherServlet";
	uri=response.encodeURL(uri);
	//向标准输出流写数据,会在浏览器显示
	out.print("<a href='"+uri+"'>跳转</a>到otherServlet");

该方式也会将JSessionID写到地址栏,不安全。
所以会规定想访问站点必须打开Cookie,保证安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值