一.会话管理
1.概述
它是指管理和跟踪用户与系统之间交互过程的技术手段。每次当用户登录到某个网站或应用后,直到用户退出或者超时这段时间内,所发生的一系列交互就被认为是一个会话(Session)。会话管理的主要目的是确保在用户进行多步骤操作时,能够持续保持用户的登录状态,并且保证数据的安全性和完整性。
我们常用的Http协议是一种无状态的协议。什么是无状态呢?就是指每个请求都是独立的,服务器处理请求时不会保留任何上下文信息。也就是说,从技术上讲,每次客户端发送请求到服务器时,服务器都不会记住之前与该客户端之间的任何交互历史。每次请求都必须包含所有必要的信息,以便服务器能够理解并正确处理请求。而会话管理有要求我们能够保持用户的登录状态,那么显然光靠Http协议是不够的,这时就要通过Cookie和Session技术了。
2.通过Cookie和Session实现会话管理
要想在客户端发出请求时,服务端能够识别该客户端,以保持数据的连续性和完整性。显然首先服务端得存储和对应客户端相关的信息,而存储该信息的便是Session
对象。要想要想服务端能够匹配不同的客户端对应的session
,则还需要一把密钥,通过该密钥使得服务端能够准确识别并且找到对应的Session
对象,而该密钥则是存放于客户端的Cookie
对象之中,以键值对JSESSIONID=***
的形式。***
就相当于密钥值,是一串数字,唯一对应一个Session
对象。
二.Cookie
1.概述
cookie是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。
服务端创建cookie,将cookie放入响应对象中,服务端容器(如Tomcat)将cookie转化为set-cookie响应头,响应给客户端,客户端在收到cookie的响应头时,在下次请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookie,由于cookie是存储于客户端的数据(如记录用户名或是保存视频播放进度等),由于这些信息比较容易暴露,一般不存储一些敏感或者影响安全的数据。
2.在Servlet中设置和读取Cookie
设置
@WebServlet("/setCookie")
public class SetCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建一个cookie对象,以键值对的形式存放数据
Cookie cookie = new Cookie("name", "value");
//添加该cookie对象
response.addCookie(cookie);
response.getWriter().println("Cookie has been set");
}
}
读取
//直接遍历所有的cookie对象
Cookie[] cookies = request.getCookies();
//注意,若没有cookie对象,不是返回一个长度为0的数组,而是返回null!!!
if (cookies != null) {
for (Cookie cookie : cookies) {
//获得key和value
String name=cookie.getName();
String value = cookie.getValue();
System.out.println(name+"="+value);
return;
}
}
//根据key获得value
String value=cookie.getAttribute(name);
3.Cookie的时效性
cookie
显然是不可能一直存在的,默认情况下Cookie的有效期是一次会话范围内,我们可以通过cookie
的setMaxAge()
方法让Cookie持久化保存到浏览器上
- 会话级
Cookie
- 服务器端并没有明确指定Cookie的存在时间
- 在客户端,Cookie数据存在于内存中
- 客户端关闭,内存中的Cookie数据就会被释放
- 持久化
Cookie
- 服务器端明确设置了Cookie的存在时间
- 在客户端,Cookie数据会被保存到硬盘上
- Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受客户端关闭的影响
- 持久化Cookie到达了预设的时间会被释放
注意:setMaxAge(int expiry)
参数单位是秒,表示cookie的持久化时间,如果设置参数为0,表示将客户端中保存的该cookie
删除。
4.Cookie的提交路径
访问服务端时不能每次都需要把所有Cookie带上。访问不同的资源时,可以携带不同的cookie,我们可以通过cookie的setPath(String path)
对cookie的路径进行设置(path为客户端访问的url),只有访问该url时才携带该cookie。
三.Session
HttpSession 是 Java Servlet API 中的一个接口,用于在 Web 应用中管理用户会话。它提供了在服务器端存储和检索会话数据的方法。HttpSession
是 Session
在 Java Servlet 环境中的具体实现。
1. HttpSession概述
HttpSession是一种保留更多信息在服务端的一种技术,服务器会为每一个客户端开辟一块内存空间,即session对象. 客户端在发送请求时,都可以使用自己的session
. 这样服务端就可以通过session
来记录某个客户端的状态了
服务端在为客户端创建session
时,会同时将session
对象的id,即JSESSIONID
以cookie
的形式放入响应对象后端创建完session
后,客户端会收到一个特殊的cookie
,叫做JSESSIONID
,客户端下一次请求时携带JSESSIONID
,后端收到后,根据它就能找到对应的session
对象.
2. HttpSession的使用
getSession()
方法是 Java Servlet API 中 HttpServletRequest
接口提供的一个方法,用于获取或创建一个 HttpSession
对象
@WebServlet("/createSession")
public class CreateSessionServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取或创建 Session
HttpSession session = request.getSession();
// 设置 Session 属性
session.setAttribute("username", "JohnDoe");
}
}
getSession()
原理:
- 检查请求中是否携带
JSESSIONID
- 若携带,则根据
JSESSIONID
的值去找对应的Session
,找到则返回HttpSession
对象,找不到则创建新的HttpSession
井将JSESSIONID以cookie
的形式放入HttpServletResponse
最后返回; - 若未携带,则创建新的
HttpSession
井将JSESSIONID以cookie
的形式放入HttpServletResponse
最后返回。
3 HttpSession时效性
当用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那显然是不可能的。
- 默认的session最大闲置时间为30分钟,在配置文件中已经定义了
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 也可以通过HttpSession的API 对最大闲置时间进行设定
// 设置最大闲置时间
session.setMaxInactiveInterval(60);
// 直接让session失效
session.invalidate();
标签:session,--,Session,cookie,Cookie,HttpSession,客户端
From: https://blog.csdn.net/2301_80295548/article/details/143026526