您现在的位置是:首页 > 正文

Session会话追踪的实现机制

2024-02-01 04:28:26阅读 1

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可以在客户端存储数据;

网站文章

  • SSM整合相关知识

    SSM整合相关知识

    SSM整合时,classpath:与 jdbc.properties的使用

    2024-02-01 04:27:56
  • 腾讯云Linux 轻量应用服务器如何搭建 FTP 服务?

    腾讯云Linux 轻量应用服务器如何搭建 FTP 服务?

    如果您选择了 FTP 主动模式,请确保客户端机器已获取真实的 IP 地址,否则可能会导致客户端无法登录 FTP 服务器。1. 修改以下配置参数,设置匿名用户和本地用户的登录权限,设置指定例外用户列表文...

    2024-02-01 04:27:49
  • nginx 无证书代理https stream模块的ssl_preread on

    当启用 "ssl_preread on" 时,nginx 会在没有证书的情况下使用 Stream 模块代理 HTTPS 流量。这意味着 nginx 将在没有验证客户端证书的情况下转发流量,但是这种方法可能不够安全。 ...

    2024-02-01 04:27:42
  • 页面访问时发生错误: java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    页面访问时发生错误: java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config在使用SpringMVC时,出现上述错误解决方法:将jstl-1.1.2.jar、standard-1.1.2.jar这2个jar包放到tomcat内的lib目录下,即可解决问题

    2024-02-01 04:27:13
  • 服务器帮挂项目,云服务器挂机项目

    服务器帮挂项目,云服务器挂机项目

    云服务器挂机项目 内容精选换一换查询云服务器组列表。GET /v2.1/{project_id}/os-server-groups参数说明请参见表1。参数说明参数是否必选描述project_id是项目...

    2024-02-01 04:27:08
  • JDK8系列:阻塞队列 之 DelayQueue(延迟队列)源码分析

    1、DelayQueue 简介 DelayQueue 是一个支持延时获取元素的无界阻塞队列,队列使用PriorityQueue来实现,队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才...

    2024-02-01 04:27:00
  • Python这些操作,逆天且实用

    1. 显示WiFi密码 我们经常忘记wifi的密码,可是每当家里来了亲戚朋友问起WiFi密码,却又无从下手。 这里有一个技巧,我们可以列出所有的设备和它们的密码。 import subprocess ...

    2024-02-01 04:26:53
  • AS3动画效果常用公式

    【转】AS3动画效果常用公式 (2012-06-13 12:21:07)转载▼ 标签: as3 效果公式 常用处理公式 基本运动公式 三角公式 it 分类: Flash/Flex/As3.0 在网上找到的,未整理。 AS3缓动公式: sprite.x += (targetX – spri...

    2024-02-01 04:26:24
  • JSP前后台数据交互

    JSP前后台数据交互

    1.一般方法:在页面加载时载入数据 首先,新建一个包,在包内创建一个类,类实现接口Servlet-javax.servlet 然后,在web.xml文件里配置如下

    2024-02-01 04:26:16
  • 魅蓝note3联通卡显示无服务器,魅蓝Note3手机卡(SIM卡)安装方法真机图文详解

    魅蓝note3联通卡显示无服务器,魅蓝Note3手机卡(SIM卡)安装方法真机图文详解

    魅蓝note3采用与或卡托设计,靠近内部卡槽位为SIM1且只能安装Nano-SIM(迷你卡);而靠近外部的卡槽为为SIM2/TF卡,这个卡槽也支持TF卡扩展,在安装单卡或者双卡的时候,需要按照以下的S...

    2024-02-01 04:26:10