文章目录
会话技术
会话:一次会话中包含多次请求和响应
浏览器第一次给服务器发送请求时,会话建立,直到有一方断开为止
功能
在一次会话的范围内的多次请求之间共享数据
客户端会话技术:Cookie
可将数据保存到客户端的会话技术
Cookie基本使用方式
创建Cookie对象
Cookie构造方法
Cookie(String name, String value)
Cookie cookie = new Cookie("msg","Cookie");
发送Cookie
response.addCookie(Cookie cookie)
response.addCookie(cookie);
获取Cookie
Cookie[] request.getCookies()
Cookie[] cookies = request.getCookies();
获取数据
String getName():获取Name
String getValue():获取Value
String name = cookie.getName();
String value = cookie.getValue();
示例
创建并发送 Demo1
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建Cookie
Cookie cookie = new Cookie("msg","Cookie");
// 发送Cookie
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
获取并输出 Demo2
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取Cookie
Cookie[] cookies = request.getCookies();
// 遍历Cookies
if (cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name + ":" + value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Cookie实现原理
基于响应头set-cookie和请求头cookie实现
当客户端浏览器第一次发送请求给服务器,response
会将cookie
中内容键值对设置到响应头set-cookie
中,当浏览器发现set-cookie
响应头时,将set-cookie
中携带的数据保存到浏览器
在客户端第二次请求服务器时,请求头中的cookie
会将之前的内容发送给服务器
Cookie细节
一次发送多个Cookie
一次可以发送多个Cookie
// 创建Cookie
Cookie cookie1 = new Cookie("msg1","Cookie1");
Cookie cookie2 = new Cookie("msg2","Cookie2");
// 发送Cookie
response.addCookie(cookie1);
response.addCookie(cookie2);
Cookie的存活时间
○ 默认情况下,当浏览器关闭后Cookie数据会被销毁
○ 可通过setMaxAge(int sec)方法设置Cookie的存储时间
- sec为正数:将Cookie数据写到硬盘文件中,数值为Cookie存储时间
- sec为负数:默认值,当浏览器关闭时Cookie数据会被销毁
- sec为0:删除Cookie信息
Cookie保存中文
在Tomcat 8之前,Cookie不可以直接存储中文数据,需要将中文数据转码
Tomcat 8之后可以存储中文数据
Cookie cookie2 = new Cookie("msg2","饼干");
response.addCookie(cookie2);
Cookie范围
若在一个Tomcat服务器中部署了多个web项目,默认情况下,cookie无法在这些web项目中共享
通过setPath(String path)方法可以设置Cookie的获取范围,没有调用该方法时,path会默认设置为当前的虚拟目录
若希望Cookie可以在当前服务器部署的多个项目中共享,可以将path设置为"/"
cookie.setPath("/");
若希望在多个服务器中共享Cookie,可以调用setDomain(String path)方法,如果设置一级域名相同,则cookie可以在多个服务器之间共享
Cookie的特点和作用
- Cookie将数据存在客户端浏览器
- 浏览器对于单个Cookie的大小、同一个域名下的Cookie数量有限制
Cookie可以存储少量的、不敏感的数据,并且可以在不登录的情况下完成服务器对客户端的身份识别
服务器端会话技术:Session
在一次会话的多次请求之间共享数据,将数据保存在服务器端的对象中
Session基本使用方式
创建HttpSession对象
HttpSession session = request.getSession();
设置Session内容
void setAttribute(String name, Object value)
session.setAttribute("key","value");
获取Session内容
Object getAttribute(String name)
Object value = session.getAttribute("key");
移除Session内容
void removeAttribute(String name)
session.removeAttribute("key");
示例
在Demo1中设置内容
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("key","value");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
在Demo2中获取内容
@WebServlet("/sessionDemo2")
public class sessionDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
Object value = session.getAttribute("key");
System.out.println(value);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Session实现原理
Session的实现依赖于Cookie
当第一次获取Session时,会在内存中创建一个新的Session对象,并通过set-cookie
响应头保存一个JSESSIONID
在第二次访问其他资源时,请求头中的cookie
会携带该JSESSIONID
,并通过这个id在内存中查找是否存在id值相同的Session对象
Session是通过依赖Cookie来保证一次会话内的多次请求响应获取的是同一个Session对象
Session细节
客户端关闭,服务器不关闭
默认情况下,客户端关闭后第二次获取的Session与第一次不同
若希望客户端关闭后还能获取到相同的Session,可以通过Cookie来保存JSESSIONID
,并设置存活时间来持久化保存
HttpSession session = request.getSession();
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
System.out.println(session);
客户端不关闭,服务器关闭
服务器关闭重启后,前后两次的Session对象不是同一个
为了确保Session的数据不丢失,Tomcat会自动执行两个操作
- Session的钝化:在服务器正常关闭之前,会将Session对象序列化到硬盘上
- Session的活化:在服务器启动后,将Session文件转为内存中的Session对象
Session何时被销毁
-
服务器关闭时Session会被销毁
-
Session对象调用
invalidate()
来销毁自己 -
Session默认失效时间为30分钟,可以在web.xml中修改该时间
Session特点
- Session用于存储
一次会话
的多次请求
的数据,数据存储在服务器端 - Session可以存储任意类型、任意大小的数据
Session与Cookie的区别
- Session存储在服务器端,Cookie存储在客户端
- Session没有数据大小限制
- Session数据安全,Cookie相对不安全