HTTP协议是一个无状态协议,即Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。
什么是会话跟踪技术?
会话就是客户端与服务器之间的一次交互,在一次交互中可能会包含多次请求和响应。在JavaWeb中,从客户端向服务器发出第一个请求开始,会话就开始了,直到客户端关闭浏览器会话结束。在一个会话的多个请求中共享数据,这就是会话跟踪技术。
Session
Session是指使用HttpSession对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象是javax.servlet.http.HttpSession接口的实例,也称为会话对象。
HttpSession对象会在用户第一次访问服务器时由容器创建(注意只有访问JSP、Servlet等程序时才会创建,只访问HTML、IMAGE等静态资源并不会创建),当用户调用其失效方法(invalidate()方法)或超过其最大不活动时间时会失效。在此期间,用户与服务器之间的多次请求都属于同一个会话。
代码示例:
package com.my.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/test.do")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("大胆,我被请求到了!");
// 第一次在访问session时,服务器会创建session
// 并根据Session_id,创建一个名称为JSESSIONID的Cookie,将Session_id保存至Cookie
// 将该Cookie响应回至浏览器客户端保存
// 接下来的每次发起请求时,客户端浏览器都会在请求头中 添加 JSESSIONID
HttpSession session = req.getSession();
System.out.println(session.getId());
}
}
浏览器中查看:
控制台查看:
通过请求路径在浏览器向服务器发起两次请求,可以看到两次请求的会话ID都一样,属于同一个会话。
注意:第一次在访问session时(即req.getSession()),服务器才会创建session。
Cookie
cookie英⽂意思是甜点的意思,我们可以在Web应⽤程序中可以使⽤cookie在客户端保持HTTP状态信息。cookie相当于是web服务器送给客户端浏览器的甜点。⾄于什么时候送,送什么样的甜点,有效期是多常时间,完全由服务器来决定。
Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。其结构就是一个键和一个值构成的。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
Cookie的用法:
在Javaweb中可以基于servlet创建Cookie,设置属性
代码示例:
package com.my.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/getcookie.do")
public class TestGetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie1 = new Cookie("phone_number", "15129802903");
Cookie cookie2 = new Cookie("name", "pig");
Cookie cookie3 = new Cookie("age", "15");
// 设置Cookie的过期时间,默认跟Session的一致
cookie1.setMaxAge(60 * 60 * 24 * 7);//7天
cookie2.setMaxAge(60 * 60 * 24 * 20);//20天
// 响应
resp.addCookie(cookie1);// 将Cookie添加至响应头
resp.addCookie(cookie2);// 将Cookie添加至响应头
resp.addCookie(cookie3);// 将Cookie添加至响应头
}
}
可在浏览器查看:
总结
- Cookie是把用户的数据写给用户的浏览器。
- Session技术把用户的数据写到用户独占的Session中。
服务器在创建会话对象时,会为其分配一个唯一的会话标识——SessionId,以“JSESSIONID”的属性名保存在客户端Cookie中,在用户随后的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪。