Session和Cookie详解
发布日期:2021-07-26 18:44:11 浏览次数:0 分类:技术文章

Cookie(客户端,不是内置对象):

Cookie是由服务端生成,再发送给客户端保存,其作用相当于本地缓存;
优点:提高访问服务端的效率 。缺点:安全性比较差;

Cookie用途:解决了相同请求的数据共享问题
如:服务器使用Cookie来跟踪客户端状态。
保存购物车(购物车中的商品不能使用request保存,因为它是一个用户向服务器发送的多个请求信息)
显示上次登录名(也是一个用户多个请求)

Cookie常用方法:
public Cookie(String name,String value);创建Cookie对象
void setMaxAge(int expiry):最大有效期(秒)
Cookie[ ] ck=request.getCookies();服务端得到客户端发来的Cookie
String getName():获取name(Cookie中的键)
String getValue():获取value(Cookie中的值)
response.addCookie():添加cookie信息,准备发送给客户端。
特别注意:获取Cookie对象,只能一次将Cookie全部获取,可以利用遍历获取指定的数据。
注意:在遍历前,要判断Coolie对象是否为null再进行获取。(原因:可能设置有效路径过后,没有Cookie信息,报空指针异常)

Cookie设置存储方式:
临时存储(默认):存储在游览器的运行内存中,游览器关闭即失效(session的Cookie为临时存储)
定时存储:存储在客户端硬盘中,设置了有效期void setMaxAge(int expiry):最大有效期(秒)
注意:清除定时存储时间,用游览器清除历史功能完成!

Cookie设置有效路径:
只有当请求此路径时,某指定的cookie信息才会附带给服务器。
利用:new Cookie.setPath(" ")

服务端发送Cookie给客户端,客户端在此请求服务器的过程:
->服务器创建Cookie对象
->response.addCookie(Cookie cookie);
->页面跳转(转发,重定向)
->客户端获取cookie:request.getCookie();
->客户端再次请求服务器,发送给服务器的有:请求信息和cookie信息
特别说明如果默认情况下:每次请求服务器都将带上cookie信息,不管有没有使用,因此不同的请求应该带不同的cookie信息,此方法为设置:cookie的有效路径

 


Session(服务端,内置对象):

Session用途:解决了发送不同请求的数据共享问题

Session常用方法:
request.getSession();(此函数有两种情况)
情况一:创建session对象(第一次访问,在客户端的发来的Cookie中没有找到JESSIONID,则会创建)
情况二:获取session对象(非第一次访问,则返回对应的session对象)。
并且他的底层实现了下面session机制中的2、3、4步骤。

session对象.getId();获取session对象的sessionid。
session对象.setMaxInactiveInterval():服务端session对象最大有效期(秒) ,默认为30分钟(设置未使用状态下服务器端自动删除sessionid)。
session对象.invalidate();使session失效(退出登录、注销)
session对象.setAttribute(String name,Object value);存储数据
session对象.getAttribute(String name);返回Object类型数据
boolean isNew():判断是否是新用户(第一次访问):request.getSession().isNew()(用来判断是在创建session还是返回session)

Session的存储方式:
1)客户端:借助Cookie的临时存储,关闭游览器,则客户端的JESSIONID将消失。
2)服务端:存储的是Session对象,对应的有一个sessionid。
如果当服务端的sessionId对象失效后(客户端的JESSIONID依然存在),再访问服务端创建了新的session对象,并将新的JESSIONID覆盖原有的JESSIONID。

Session机制(原理):
1)客户端第一次请求服务端时(如:登录淘宝账户),登录成功后,服务端会产生一个session对象(用于保存该客户的信息,例如:订单,历史记录...)。
特别注意:服务器第一次获取session时,如果没有session对象才会产生session对象(如:第一次执行requst.getSession时)。
进一步加深,如果访问jsp文件,那么会自动创建session(原因:JSP会自动转为Servlet文件,而session是jsp内置对象,即Servlet中创建了session对象),如果访问Servlet则必须获取session才会创建。

2)并且每个session对象都会有一个唯一的sessionId(用于区分不同session)。

3)同时服务端又会自动产生一个cookie对象,将sessionId的值赋值给JESSIONID,最终cookie的name="JESSIONID",value=服务端sessionId的值;

4)最后服务端会在响应客户端的同时,自动执行response.addCookie(),将保存JESSIONIDD的cookie发送给客户端,至此客户端有了一个JESSIONID。

5)因此,客户端的"JSESSIONID"就可以和服务端的"SessionId"一 一对应 。

6)客户端第二/N次请求服务端时:服务端会先用客户端cookie中的JSESSIONID去服务端的session中匹配sessionid,如果匹配成功,说明此用户不是第一次访问,session对象中保存由该用户的所有行为信息(如:游览记录,订单...等),无需再次登录。

特别说明:在创建session对象时,底层已经帮我们执行了2),3),4)步骤。

 

session小考点:
requst.getSession(false)与requst.getSession(true)、requst.getSession()的区别
第一个:如果session缓存中cookie不存在,及session不存在,则返回null,不会创建session。
第二、三个:~~~~~~~~,创建session。

上一篇:Servlet接口以及ServletConfig介绍
下一篇:get和post的区别