会话技术
一次会话:客户端连接上服务器开始,客户端退出结束,会产生多次请求
Cookie
客户端技术
不安全(客户端可以删除,查看), 但可以减轻服务器压力
- 向客户端存储cookie
response.addCookie(cookie) - 本质是response.setHeader(“set-cookie”)
// 将数据存储在cookie中, 通过response对象
// a.创建cookie对象 String-String类型的键值对
Cookie cookie = new Cookie("name", "zhangsan");
// b.通过response将cookie传递给客户端
// 本质是通过响应头set-cookie,把数据传递给客户端的
response.addCookie(cookie);
- 从客户端获取cookie
request.getCookies() - 本质是request.getHeader(“cookie”)
// 通过请求对象获得cookie
// 将客户端携带过来的cookie全部获得
Cookie[] cookies = request.getCookies();
if (cookies != null) {
// 假设只有一个cookie对象
String name = cookies[0].getName();
String value = cookies[0].getValue();
response.getWriter().write("success: " + name + "," + value);
} else {
response.getWriter().write("cookie is null");
}
- cookie默认的生命周期:new 开始, 到会话结束
设置持久化时间:cookie.setMaxAge(int 秒);
设置时间=0, 立即删除
设置时间=-1, 恢复默认
// 设置cookie的持久化时间(秒)
cookie.setMaxAge(60*5);
- 设置cookie的携带路径
cookie.setPath()
1. / — 当前服务器所有资源
2. /web — 当前应用所有资源
3. /web/DemoServlet — 单纯只有DemoServlet资源
默认:当前目录
set-cookie的资源路径: (当前目录:cookie)http://localhost:8080/web/cookie/DemoServlet
// 设置cookie的携带路径
// 设置cookie在访问DemoServlet的时候才会携带到服务器
cookie.setPath("/web/DemoServlet");
// 设置cookie在访问web应用中所有的资源都会携带到服务器
cookie.setPath("/web");
// 设置cookie在访问这个服务器中所有的资源时,都会携带到服务器
cookie.setPath("/");
- 注意:只有当cookie的name和path一致的时候才会认为是同一个cookie
例:c1、c2不是同一个cookie- Cookie c1 = new Cookie(“name”,“zhangsan”);
Cookie c2 = new Cookie(“name”,“zhangsan); c2.setPath(”/");
- Cookie c1 = new Cookie(“name”,“zhangsan”);
Session
服务器技术
安全, 但服务区压力较大
域对象范围:一次会话
-
服务器第一次为客户端创建Session对象的时候, 会分配一个JSESSIONID编号,并且将 JSESSIONID 传递给客户端的cookie进行保存
-
一次会话结束, 下次会话想要继续访问之前的session,需要将JSESSIONID 进行持久化
// 1.获取session对象
HttpSession session = request.getSession();
// 2.获取session的id
String jsessionid = session.getId();
// 3.创建一个一模一样的cookie
Cookie cookie = new Cookie("JSESSIONID", jsessionid);
cookie.setPath(request.getContextPath());
// 4.设置这个cookie持久化时间
cookie.setMaxAge(Integer.MAX_VALUE);
// 5.将原来的cookie覆盖
response.addCookie(cookie);
// 2.向session中存储数据
session.setAttribute("name", "zhangsan");
// 1.获取session对象
HttpSession session = request.getSession();
// 2.从session中取数据
String name = session.getAttribute("name");
- session的生命周期
创建:客户端第一次调用getSession()方法时
销毁:
– 手动销毁 session.invalidate();
– 服务器非正常关闭
注意:服务器正常关闭, session不会消失, 会变成文件保存在本地磁盘 - session钝化
– 超时30分钟
<session-config>
<session-timeout>分钟</session-timeout>
</session-config>
域对象
ServletContext:服务器启动期间
session:一次会话
request:一次请求
pageContext:page域(当前页面)