session会话的定义
打开浏览器,进行一系列操作。。。,最后关闭浏览器。这个过程称为:一次会话。
会话在服务端会有对应的一个Java对象,名称为:session对象。
在浏览器中,用户点击了以下,然后停了下来,这个过程粗略的认定为:一次请求。
请求在服务端也会有对应的一个Java对象,名称为:request对象。
一个会话可以包含多个请求。
在Java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)
session机制是属于B/S结构的一部分,实际上也是一个规范,不同语言都会有不同实现。
session和cookie为什么会存在?
因为http协议是无状态的协议,session和cookie用来保存用户的会话状态。
无状态是指:在请求时,B和S相连,请求结束之后,连接就会断开,这样设计的原因是为了缓解服务器压力。
服务器无法知道用户是否关闭了浏览器。
session的实现原理
用户第一次请求时,服务器端会生成session对象,以及JSESSIONID,然会把sessionid发送给浏览器端存储;
用户第二次请求时,浏览器cookie会携带JSESSIONID,请求服务器,服务器端根据sessionid找到对应的session对象。
JSESSIONID是以Cookie的形式保存在浏览器的内存中的,
当浏览器关闭,内存消失,cookie就消失了,JSESSIONID就消失了,一次会话结束。
涉及到的域对象
○ request(对应的类名:HttpServletRequest)
■ 请求域(请求级别的)
○ session(对应的类名:HttpSession)
■ 会话域(用户级别的)
○ application(对应的类名:ServletContext)
■ 应用域(项目级别的,所有用户共享的。)
○ 这三个域对象的大小关系
■ request < session < application
○ 他们三个域对象都有以下三个公共的方法:
■ setAttribute(向域当中绑定数据)
■ getAttribute(从域当中获取数据)
■ removeAttribute(删除域当中的数据)
○ 使用原则:尽量使用小的域。
cookie的实现原理
在session的实现原理中,每一个session对象都会关联一个sessionid。
JSESSIONID=xxxx这个键值对数据其实就是cookie对象。
用户第二次发送请求时,会通过
Cookie:JSESSIONID=xxxx 的形式把cookie发送给服务器,服务器就是根据xxxx来查找对应的session会话对象。
在Java的servlet中,对cookie提供了哪些支持?
Java提供了一个Cookie类来表示cookie数据。jakarta.servlet.http.Cookie
Java程序通过response.addCookie(cookie)把cookie数据发送给浏览器。
HTTP协议中规定:当浏览器发送请求的时候,会自动携带该path下的cookie数据给服务器。(URL)
# 创建cookie对象
Cookie cookie = new Cookie();
# 设置cookie的过期时间,单位:秒
# 如果没有设置有效时间:默认保存在浏览器的运行内存中,浏览器关闭则cookie消失。
# 只要设置cookie的有效时间大于0,这个cookie一定会存储到硬盘文件当中。
# cookie的有效时间等于0,则相当于删除同名的cookie。
# cookie的有效时间小于0,则相当于没设置过期时间。
cookie.setMaxAge(60 * 60)
# 设置关联路径,只要时请求/user下的路径,就会携带该cookie对象。
cookie.setPath(“/user”)
浏览器发送cookie给服务器了,服务器中的java程序怎么接收
// 这个方法可能返回null
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
// 获取cookie的name
String name = cookie.getName();
// 获取cookie的value
String value = cookie.getValue();
}
}
服务器端获取session:
# 获取session对象,如果没有则创建一个session对象。
HttpSession session = request.getSession();
# 获取session对象,如果没有则返回null
HttpSession session = request.getSession(false);