Servlet-会话管理
会话管理
HTTP是无状态协议
无状态即不保存状态,HTTP协议自身不对请求和响应之间的通信状态进行保存
会话管理的实现的手段
使用Cookie和Session配合解决
Cookie是在客户端保留少量数据的技术,主要是通过响应头向客户端响应一些客户端要保留的信息
Session是在服务端保留更多数据的技术,主要通过HttpSession对象保存一些和客户端相关的信息
Cookie和Session配合记录请求状态
Cookie
Cookie的创建
服务端创建Cookie,将Cookie放入响应对象中,Tomcat容器将Cookie转化为set-cookie响应头,响应给客户端
@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
@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删除
cookieA.setMaxAge(60 * 60); //设置Cookie的时效时间为1小时
Cookie的提交路径
我们设置的Cookie在浏览器中保存,但无论是访问哪一个网页都会携带这个Cookie
为了解决这个问题,我们使用setPath()方法设置Cookie的携带路径
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对象
HttpSession session = req.getSession(); //获取Session
这个方法的执行步骤:
- 判断请求中有没有一个名为JSESSIONID的特殊Cookie
- 如果有,则根据JSESSIONID找对应的Session对象
- 找到对象后,将此对象返回
- 如果没找到,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie
- 如果没有,则创建一个新的Session返回,并且向response对象中存放一个JSESSIONID的Cookie
- 如果有,则根据JSESSIONID找对应的Session对象
SessionAPI
方法名 | 说明 |
---|---|
getId() | 获取JSESSIONID |
isNew() | 判断该Session是否为新建,而不是被找到 |
setAttribute() | 存放键值对在Session中 |
getAttribute(String key) | 根据键获取值的对象 |
注:Session中的值可以存放object类型,当我们知晓存入值类型可将他安全强转
Session的时效性
Session的时效性是30分钟,但有人访问后,会重新计时
我们可以在web.xml中设置Session的时效性
<session-config>
<session-timeout>30</session-timeout>
</session-config>
我们可以在Sevlet中单独设置Session的时效性(以秒为单位)
session.setMaxInactiveInterval(60 * 60); //设置Session的时效性为1小时