HTTP协议是一个无状态协议,即Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。
会话就是客户端与服务器之间的一次交互,在一次交互中可能会包含多次请求和响应。在JavaWeb中,从客户端向服务器发出第一个请求开始,会话就开始了,直到客户端关闭浏览器会话结束。在一个会话的多个请求中共享数据,这就是会话跟踪技术。
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英⽂意思是甜点的意思,我们可以在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添加至响应头
-
- }
- }
可在浏览器查看:
服务器在创建会话对象时,会为其分配一个唯一的会话标识——SessionId,以“JSESSIONID”的属性名保存在客户端Cookie中,在用户随后的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪。