Servlet-会话管理

会话管理

HTTP是无状态协议

无状态即不保存状态,HTTP协议自身不对请求和响应之间的通信状态进行保存


会话管理的实现的手段

使用Cookie和Session配合解决

Cookie是在客户端保留少量数据的技术,主要是通过响应头向客户端响应一些客户端要保留的信息

Session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息

Cookie和Session配合记录请求状态


Cookie的创建

服务端创建Cookie,将Cookie放入响应对象中,Tomcat容器将Cookie转化为set-cookie响应头,响应给客户端

1
2
3
4
5
6
7
8
9
10
11
12
@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建Cookie
Cookie cookieA = new Cookie("keyA","valueA");
Cookie cookieB = new Cookie("keyB","valueB");
//将Cookie放入response对象
resp.addCookie(cookieA);
resp.addCookie(cookieB);
}
}

Cookie的获取

在获取Cookie时,如果没有Cookie,Cookie数组为null 而不是 0

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet("/ServletB")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求中携带的Cookie(以Cookie数组的形式储存)
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " : " + cookie.getValue());
}
}
}
}

Cookie的时效性

默认情况下Cookie的有效期是一次会话范围内,我们可以通过Cookie的setMaxAge()方法让Cookie持久化保存到浏览器上

  • 会话级cookie
    • 服务端没有明确指定Cookie的存在时间
    • 在浏览器端,Cookie数据存在于内存中
    • 只要浏览器还开着,Cookie数据都一直在
    • 浏览器关闭,内存中的Cookie数据就会被释放
  • 持久化Cookie
    • 服务端明确设置了Cookie的存在时间
    • 在浏览器端,Cookie数据会被保存到硬盘上
    • Cookie 在硬盘上的存在时间根据服务端限定的时间来管控,不受浏览器关闭的影响
    • 持久化Cookie到达了预设的时间会被释放

setMaxAge方法的参数设置单位时间是秒,如果参数为0,则表示要将此cookie删除

1
cookieA.setMaxAge(60 * 60); //设置Cookie的时效时间为1小时

Cookie的提交路径

我们设置的Cookie在浏览器中保存,但无论是访问哪一个网页都会携带这个Cookie

为了解决这个问题,我们使用setPath()方法设置Cookie的携带路径

1
cookieB.setPath("/ServletB"); //只有访问ServletB页面才携带此Cookie

Session

Session是搭配Cookie使用的

Session用来在服务端记录客户端的某个状态,在用户访问服务端时被创建/找到

服务端在为客户端创建Session时,会同时将Session对象的id,即JSESSIONID以Cookie的形式放入响应对象

客户端在下次请求时携带JSESSIONID,服务端收到后,根据JSESSIONID找到相应的session对象

Session通常应用于记录用户的登录状态和用户的操作历史

Session也是域对象


Session的获取

在Servlet中获取Session的方法与Cookie不同,需要使用req调用getSession方法获取Session对象

1
HttpSession session = req.getSession(); //获取Session

这个方法的执行步骤:

  • 判断请求中有没有一个名为JSESSIONID的特殊Cookie
    • 如果有,则根据JSESSIONID找对应的Session对象
      • 找到对象后,将此对象返回
      • 如果没找到,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie
    • 如果没有,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie

SessionAPI
方法名 说明
getId() 获取JSESSIONID
isNew() 判断该Session是否为新建,而不是被找到
setAttribute() 存放键值对在Session中
getAttribute(String key) 根据键获取值的对象

注:Session中的值可以存放object类型,当我们知晓存入值类型可将他安全强转


Session的时效性

Session的时效性是30分钟,但有人访问后,会重新计时

我们可以在web.xml中设置Session的时效性

1
2
3
<session-config>
<session-timeout>30</session-timeout>
</session-config>

我们可以在Sevlet中单独设置Session的时效性(以秒为单位)

1
session.setMaxInactiveInterval(60 * 60); //设置Session的时效性为1小时


Servlet-会话管理
http://blog.170827.xyz/2024/04/24/Servlet-会话管理/
作者
XIAOBAI
发布于
2024年4月24日
许可协议