Java Web|day7. Web会话跟踪(cookie与session)

news2024/9/23 19:14:21

Web会话跟踪(cookie与session)

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。

cookie

定义

cookie是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

类型

  1. 内存式Cookie

    内存式Cookie存储在内存中,浏览器关闭后就会消失,由于其存储时间较短,因此也被称为非持久Cookie或会话Cookie。

  2. 硬盘式Cookie

    硬盘式Cookie保存在硬盘中,其不会随浏览器的关闭而消失,除非用户手工清理或到了过期时间。由于硬盘式Cookie存储时间是长期的,因此也被称为持久Cookie。

工作原理

图示

在这里插入图片描述

  1. Cookie定义了一些HTTP请求头和HTTP响应头,通过这些HTTP头信息使服务器可以与客户进行状态交互。
  2. 客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。
  3. 再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。

使用方法

  1. ava中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。

  2. 通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回)

  3. 通过response.addCookie(Cookiecookie)向客户端设置Cookie。

  4. Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。

  5. //新建Cookie
    Cookie cookie = new Cookie("username","helloweenvsfei"); 
    //设置生命周期为MAX_VALUE
    cookie.setMaxAge(Integer.MAX_VALUE);  
    //输出到客户端
    response.addCookie(cookie);           
    

注意:因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。

常用属性

    private static final CookieNameValidator validation;
    private static final long serialVersionUID = 1L;
	//Cookie的名称
    private final String name;
	//Cookie的值
    private String value;
	//该Cookie的版本号
    private int version = 0;
	//用处说明
    private String comment;
	//可以访问该Cookie的域名.
    private String domain;
	//Cookie的失效时间,时间秒,默认为-1,如果为0,则表示删除该Cookie
    private int maxAge = -1;
	//Cookie的使用路径
    private String path;
	//是否仅被使用安全协议传输
    private boolean secure;
    private boolean httpOnly;

在这里插入图片描述

在这里插入图片描述

session

定义

客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

注意

  1. Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
  2. 如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
  3. 当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。
  4. 只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

工作原理

在这里插入图片描述

session id保存

  1. 使用Cookie进行保存

    • 保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。

    • 然而,比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。

  2. URL重写

    • 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。
    • 类型
      • 附加方式也有两种,一种是作为URL路径的附加信息
        • http://…/xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
      • 另一种是作为查询字符串附加在URL后面
        • http://…/xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    • 注意
      • TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。
  3. 表单隐藏字段

    • 表单隐藏就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

使用方法

  1. Session对应的类为javax.servlet.http.HttpSession类。
  2. 每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。
  3. Session对象是在客户端第一次请求服务器的时候创建的。
  4. Session也是一种key-value的属性对,通过getAttribute(String key)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session,
// 获取Session对象 
HttpSession session = request.getSession();       
// 设置Session中的属性 
session.setAttribute("loginTime", new Date());     
// 获取Session属性
System.out.println("登录时间为:" +(Date)session.getAttribute("loginTime"));    

常用方法

在这里插入图片描述

在这里插入图片描述

cookie和session的区别

  1. cookie数据存放在客户端,session数据放在服务器上。
  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
  3. session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用cookie。
  4. 不同浏览器对cookie的数据大小限制不同,个数限制也不相同。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  5. 可以考虑将登陆信息等重要信息存放为session,不重要的信息可以放在cookie中。

cookie和session的联系

  1. 都是用来记录用户的信息,以便让服务器分辨不同的用户。
  2. 可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虹科应用|增强型以太网交换机:如何实现同IP控制的高效网络管理?

导读:车载以太网交换机的配置和管理是确保数据流高效、安全传输的关键。虹科增强型以太网交换机(EES)通过其先进的功能,为用户提供了一种灵活且高效的解决方案。 随着车载网络对带宽需求的不断提高,虹科Technica推出一…

第二届EI机器视觉、图像处理与影像技术国际会议将于9月13-15日召开

第二届机器视觉、图像处理与影像技术国际会议(The 2nd International Conference on Machine Vision, Image Processing & Imaging Technology,简称MVIPIT)将于2024年9月13日-15日在中国张家口举行。 MVIPIT 2024聚焦机器视觉、图像处理…

如何将 CICD 模版重构为 CICD component?

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…

MFC画图示意八皇后问题的含义

八皇后问题是C语言算法的一个经典例子; 它要求解的问题是, 以国际象棋为背景,有八个皇后(八个棋子),如何在 8*8 的棋盘中放置八个皇后,使得任意两个皇后都不在同一条横线、纵线或者斜线上。 根据资料,答案不止一个,共有92个;可以有92种摆法; 第一个答案应该是如…

小程序学习day08-导航传参、下拉刷新(移动端的专有名词)、上拉触底(移动端的专有名词)、自定义编译模式、生命周期

34、导航传参 (1)声明式导航传参 1)Navigator组件的url属性用来指定将要跳转到页面的路径,同时,可以携带参数 2)携带参数的要求 ①参数与路径之间用?分隔 ②参数键与参数值之间用相连 ③不同参数用&…

如何在手机版和网页版Facebook上更改名字(2024)

本文将详细介绍如何在Facebook上更改名字,包括手机和网页版Facebook的具体步骤,以及添加Facebook昵称的方法,并分享如何高效管理多个Facebook网页版账户。 Facebook怎么改名字 Facebook手机版改名 打开Facebook APP并登录账号。 点击右下角的…

TinTinLand Web3 + DePIN 共学月|深入探索 DePIN 项目,全景分析去中心化网络未来

「TinTinLand Web3 主题共学月」是由 TinTinLand 每月发起的主题学习活动,携手知名项目共同打造一个系统化、互动性强的学习平台,帮助开发者不断提升技能,紧跟 Web3 技术的前沿发展。活动通过演示视频、学习打卡、模拟环境、实际操作等多种方…

2024-08-16升级记录:使用Android RecyclerView控件显示列表型信息

在页面上使用RecyclerView实现一个列表型信息展示&#xff1a; 步骤如下&#xff1a; 一、在页面布局中添加RecyclerView控件 <TextViewandroid:id"id/txt_gnss_info"android:layout_width"match_parent"android:layout_height"wrap_content"…

学习node.js 二 path模块,os模块,process

目录 path模块 1. path.basename() 2. path.dirname 3. path.extname 4. path.join 5. path.resolve 6. path.parse path.format OS模块 1. 获取操作系统的一些信息 &#xff08;1&#xff09;os.platform() &#xff08;2)os.release &#xff08;3&#xff09;os.ho…

1.1GB大更新,华为Pura70系列鸿蒙新版本优化哪些方面

华为Pura70 Pro手机迎来了其操作系统的又一次重要更新&#xff0c;推送了鸿蒙4.2.0.176新版本。这次升级不仅在安全性、音效和智慧多窗等方面进行了优化&#xff0c;还集成了2024年7月的安全补丁&#xff0c;为用户带来了更加安全、流畅的使用体验。 1.升级包内容丰富 华为Pur…

Python编码系列—掌握Python Web开发:Flask与FastAPI实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Ropdump:针对二进制可执行文件的安全检测工具

关于Ropdump Ropdump是一款针对二进制可执行文件的安全检测工具&#xff0c;该工具基于纯Python开发&#xff0c;是一个命令行工具&#xff0c;旨在帮助广大研究人员检测和分析二进制可执行文件中潜在的ROP小工具、缓冲区溢出漏洞和内存泄漏等安全问题。 功能介绍 1、识别二进…

win10安装docker,打包python、java然后centos执行镜像

一、win10安装Docker Desktop docker官网&#xff08;需要魔法&#xff09;下载&#xff1a;https://www.docker.com/products/docker-desktop/ 安装方法参考&#xff1a;https://blog.csdn.net/beautifulmemory/article/details/137970794 下载完毕后界面安装&#xff0c;不勾…

日拱一卒(3)——leetcode学习记录:二叉树最小深度

一、任务&#xff1a;平衡二叉树 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 二、思路&#xff1a; 1. 递归计算二叉树的深度 节点不存在&#xff0c;返回0…

2024新型数字政府综合解决方案(九)

新型数字政府综合解决方案通过整合人工智能、大数据、区块链与云计算技术&#xff0c;构建了一个智能化、透明化和高效的政务服务平台&#xff0c;以提升政府服务的响应速度和处理效率&#xff0c;增强数据的安全性和透明度&#xff1b;该平台实现了跨部门的数据共享与实时更新…

Zotero更改插入word中所有引用编号的颜色

002-如何批量更改Zotero插入在word中参考文献的颜色&#xff08;快速变蓝&#xff09; 主要根据此视频进行学习。 需要记住 查找的内容为&#xff1a; ^19 ADDIN ZOTERO_ITEM 在word中打开 文件->更多->选项->高级 下滑选择域底纹&#xff0c; 可以看到所有的引用 …

【数据结构与算法】分治法

分治法目录 一.分治法的思想二.分治法的步骤三.举个例子四.具体实现五.完整代码 一.分治法的思想 将一个大问题,拆解成为若干个小问题,而且大问题与小问题的解决方法一样. 说到这里我们可以联想到递归,没错就是用递归的思想. 分:递归解决较小的问题 治:子问题的解构建原问题的…

RTX 4070 GDDR6显存曝光:性能与成本的平衡之选

近期&#xff0c;关于NVIDIA RTX 4070新显卡的信息曝光&#xff0c;这款显卡将配备较为缓慢的GDDR6显存&#xff0c;而非更高性能的GDDR6X。这一配置的选择引发了业内的广泛关注&#xff0c;特别是在性能与成本的平衡问题上。 新版RTX 4070 OC 2X的核心特点 **1.显存类型与带…

Python | Leetcode Python题解之第341题扁平化嵌套列表迭代器

题目&#xff1a; 题解&#xff1a; class NestedIterator:def __init__(self, nestedList: [NestedInteger]):# 对于nestedList中的内容&#xff0c;我们需要从左往右遍历&#xff0c;# 但堆栈pop是从右端开始&#xff0c;所以我们压栈的时候需要将nestedList反转再压栈self.…

数据结构----链表

一丶概念 链表又称单链表、链式存储结构&#xff0c;用于存储逻辑关系为“一对一”的数据。 和顺序表不同同&#xff0c;使用链表存储数据&#xff0c;不强制要求数据在内存中集中存储&#xff0c;各个元素可以分散存储在内存中。 二丶特点 特点&#xff1a;内存不连续…