Session会话追踪的实现机制

发布于:2023-01-04 ⋅ 阅读:(282) ⋅ 点赞:(0)

Session简介

Session(会话)是Servlet中的一种特殊的机制,它可以用来存储K-V键值对,它的生命周期较长,在服务器关闭或Session失效和客户端浏览器关闭之前,Session中的数据都不会消失,而且每个客户端独有一个Session会话,相互之间互不干扰。但是我们使用的Http协议是一种无状态协议,Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。

每个用户第一次访问服务器后,服务器都会自动创建一个Session并且生成一个唯一的Session ID随着第一次响应带给客户端浏览器,这样,用户以后每次在访问服务器时都会带着上次获取的SessionID,这就像是一个“身份证”一样,以便于服务器更好的识别用户身份。如果用户在一段时间内没有访问服务器,那么Session会自动失效,下次即使带着上次分配的Session ID访问,服务器也会认为这是一个新用户,会再次分配新的Session ID。一次Session会话中往往包含着若干次request请求。

当我们需要向Session(会话)中存储值时,这时我们只需获取服务器已经创建好了的Session,JavaEEServlet机制内建立了对Session的支持。当我们需要获取Session时,可以通过request请求对象的getSession()方法即可

		HttpSession session=req.getSession();
		String sessionid=session.getId();
		System.out.println();

在Java中Session的常用方法
void setAttribute(String name, Object value):将值,存入当前Session会话中。


Object getAttribute(String name):按照指定的Key获取Value。
void removeAttribute(String name):按照指定的Key从Session中删除值。
long getCreationTime():获取当前Session会话的创建时间。
long getLastAccessedTime():获取当前Session请求的访问时间。
String getId():获取当前Session会话的sessionid。

http链接的特殊性

 HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否处在连接状态。但是这样的通信协议使得服务器端难以判断所连接的客户端是否是同一个人。当进行Web程序开发时,我们必须想办法将相关的请求结合一起,并且努力维持用户的状态在服务器上,这就引出了会话追踪(session tracking)。

1:会话与会话追踪

session中文经常翻译为“会话”,其本来的含义是指有始有终的一系列动作或消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候可以看到这样的话“在一个浏览器会话期间……”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间;如果说“用户在一次会话期间……”这样一句话,它指用户的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程;然而有时候也可能仅仅是指一次连接。session的含义很多,其中的差别只能靠上下文来推断。session tracking(会话追踪)是指一类用来在客户端与服务器之间保持状态的解决方案,简单地说,当一个客户在多个页面间切换时,服务器会保存该用户的信息。

在代码中我们也可以获得cookie


package com.zero.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("/cookie.do")
public class TestGetCookieServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Cookie[] cookie = req.getCookies(); 
		if(cookie != null) {
			for (Cookie ck : cookie) {
				System.out.println(ck.getName());
				System.out.println(ck.getValue());
				System.out.println();
			}
			
		}
	}
 

 小结:

  • Servlet容器提供了Session机制以跟踪用户;
  • 默认的Session机制是以Cookie形式实现的
  • 通过读写Cookie可以在客户端存储数据;