Cookie和Session

一、会话技术

http协议:http协议是一个无状态协议,所谓无状态协议,是指上一次请求和当前请求之间没有任何的联系,所以无法进行数据共享。

会话技术:为了能够让多次请求响应之间可以共享数据,需要提供一门新的技术,这么技术就是会话技术。

所谓会话技术,就是为了实现某一个功能,在浏览器服务器建立连接之后,发送多次请求和响应之间,在这些请求和响应中共享数据,实现功能目的。直到浏览器关闭之前,发送所有的请求和响应都属于一次会话

二、Cookie

【1】cookie 的实现原理 

在浏览器第一次发送请求的时候,携带一个请求参数,这个参数到达服务器中,会在响应过程中,以set-cookie响应头的形式重新回到浏览器中,并且保留在浏览器中。当发送第二次请求的时候,请求中会自动携带一个cookie请求头,请求头中的数据就是刚刚在浏览器中保留的cookie信息。

【2】Cookie类

创建Cookie类

Cookie cookie = new Cookie(String name,String value);

【3】设置Cookie时间

设置Cookie最大时长

cookie.setMaxAge();

如果不设置最大生命时长,则cookie是一个会话级别的cookie,在浏览器关闭之后,就会立刻销毁。如果设置了最大生命时长,cookie会序列化到磁盘,形成一个文件,这个文件在到达最大生命时长时,会由浏览器自动销毁。

【4】设置Cookie有效路径

设置路径

cookie.setPath(request.getContextPath()+"/");

有效路径是指,在某一个虚拟路径级别之下,可以获取到cookie,无论是静态资源还是动态资源,甚至是404页面,只要是在有效路径下,都可以获取到cookie。如果不设置cookie的有效路径,则cookie只在当前资源的路径级别之下有效。如果设置,则在设置的路径级别之下有效。

【5】删除Cookie

cookie类中没有提供删除cookie的方法,而是通过发送一个与要删除cookie完全一致生命时长为0cookie到浏览器,将原有cookie覆盖,这种形式来删除cookie。判断两个cookie完全一致:同name+同path+同domain

【6】Cookie的其他API操作

response.addCookie(Cookie cookie);                     发送Cookie

Cookie[] cs = request.getCookies();                        获取Cookie(返回Cookie数组)

cookie.getName();                                                   获取cookie名称                   

cookie.getValue();                                                    获取cookie值

【7】注意

如果向Cookie中设置中文,应注意”500 Control character in cookie value or attribute.“编码错误,Cookie是存放在浏览器端的,是根据net编码规则的,所以,如果要传入中文的话,要按以下规则进行

编码规则:URLEncoder.encode("张三","UTF-8")

Cookie cookie = new Cookie("name", URLEncoder.encode("张三","UTF-8"));

解码规则:URLDecoder.decode(cookie.getValue(),"UTF-8")

String username = URLDecoder.decode(cookie.getValue(),"UTF-8");

三、Session

【1】Session会话技术

由于在浏览器端存储数据安全性较差,所以考虑将数据放入服务器中,提升数据的安全性。将数据存放在服务器中的这门会话技术,就是session会话技术。

【2】Session原理 

在浏览器访问服务器后,如果有session对象创建的代码执行,则会在服务器中创建一个session对象,这个session中可以保存当前浏览器的数据,多个浏览器会各自在服务器中保留各自的session对象,这些对象是通过JSESSIONID来区分的。

【2】Session对象的创建不同方式

request.getSession();           如果当前服务器中没有当前浏览器的session对象,则会立刻创建一个session对象,如果有session对象,则

会直接取出使用。

request.getSession(true);     如果当前服务器中没有当前浏览器的session对象,则会立刻创建一个session对象,如果有session对象,则

会直接取出使用。和第一种方式一样的原理。

request.getSession(false);    如果当前服务器中没有当前浏览器的session对象,会返回null,如果有session对象则会直接取出使用。

【3】Session原理:

session是一个基于cookie工作的对象。本质就是一个cookie。在浏览器中会保留一个名称为JSESSIONID的cookie,用于存储当前session对象的id。

【4】Session特点

session是将数据保留在服务器端,是一门服务器端的技术。由于数据存放在服务中,所以安全性较好。但是只能存储要求保留时间较短的数据。此外,Session是一个域对象

【5】生命周期 

在request.getSession()调用的时候,session对象创建,生命周期开始。

死亡的三种方式

主动:主动调用session.invalidate()方法释放session对象。

被动:在服务器中存有session对象,服务器意外关闭,session对象会被销毁。如果服务器正常关闭,session对象中有仍数据,则这个session对象会被序列化到磁盘上,这个过程称之为钝化,当前服务器下一次重启的时候,会自动读取这个磁盘上的文件,这个过程称之为活化。

超时:如果一个session对象超过30分钟未被使用,会被服务器自动销毁。这个超时时间可以通过web.xml来设置。

以上三种方式都会导致session对象销毁,生命周期结束。

【6】作用范围:整个会话范围。

【7】主要功能:在整个会话范围内共享数据。

四、Session与Cookie区别

Cookie是储存在浏览器端的,Session是存储在服务器端的。

Cookie由于数据存储在浏览器内,所以安全性较低。Session由于数据存储在服务器中,所以安全性较高。

Cookie存储数据的存放时间可以很长。Session存储数据的存放时间不能过长,否则服务器将会压力很大。

Cookie善于安全性要求较低,但是存储时间较长的数据。

Session善于安全性要求较高,但是存储时间较短的数据。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值