深入分析Java Web -- cookie和session

简介: 深入分析Java Web -- cookie和session

关于项目里面经常用到的技术之一,cookie和session机制。或许很多人对于这个机制的了解只是比较粗浅,所以这一次就来深入剖析一下cookie和session的内容吧。

 

关于javaee里面的cookie而言,可以理解为,每一次客户端请求一次服务端之后,服务器返回给客户端的一个标识。这种标识类似于k,v的模式存在,每个浏览器再次请求服务器的时候就需要携带这个标识,从而让服务端来认证。


但是对于cookie的认识光有这些还不够,接下来我们从几个常用的场景来进行分析:


1. cookie大小设置


假若面临一个业务场景,如果一个网站的pv数据量为1亿,那么cookie的大小设置在200字节左右,得占用多么大的带宽啊!


对于普通中小型企业的项目,性能优化方面,我们可以从cookie的大小方面来进行设置。


2. cookie的版本


关于cookie的历史版本而言,他有两种版本,分别是version0和version1

版本0 : 由Netscape公司制定的,也被几乎所有的浏览器支持。Java中为了保持兼容性, 目前只支持到版本0, Cookie的内容中不能空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号。


版本1 : 根据RFC2109文档制定的。放宽了很多限制。版本0中所限制的字符都可以使用。但为了保持兼容性,程序开发者都会尽量避免使用这些特殊字符

 

3. cookie的作用域

 

不同的cookie分别都会有自己的作用域,例如说谷歌网站的cookie就只有访问google的时候会携带,facebook的cookie也只有访问facebook的时候会携带,不会出现访问facebook网站的时候携带上google的cookie

 

4. cookie的生命周期


每个cookie都会有自己的生命周期,一旦过了生命周期时间范围,cookie就会过期。

例如一下代码:


Cookie c = new Cookie(“username”,”john”);

c.setMaxAge(60);//60秒的意思

c.setMaxAge(60*60);//一小时

c.setMaxAge(365*24*60*60);//一年


如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。


这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。


如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

 

Session


对于session而言,它相较于cookie会安全许多。Session一般译为会话,是解决Http协议的无状态问题的方案,可以将一次会话中的数据存储在服务器端的内存中,保证在下一次的会话中可以使用。


在客户端浏览器第一次向服务器端发送请求时,服务器端会为这个客户端创建独有的Session,并具有唯一的Session ID,存储在服务器端的内存中。在客户端第二次访问服务器端时,会携带Session ID在请求中,服务器端会根据Session ID查找对应的Session信息,进行进一步地操作。


在JavaEE中提供了javax.servlet.http.HttpSession接口,通过该接口可以将共享的数据内容存储在HttpSession对象中,从而解决Http协议的无状态问题。

 

那么光是了解session的这些还不够,接下来让我们深入session的内部进行研究。

关于session的内部研究,可以如下进入:


自己编写一个简单的servlet,然后开启tomcat,设置成debug模式,打一个断点,当请求该servlet的时候,程序会在断点处停止。


网络异常,图片无法展示
|


这个时候,查看调试窗口里面的内容,会发现一下内容:


网络异常,图片无法展示
|


咦,这个standardsession是个什么鬼东西,推测这个standardsession是httpsession接口的实现类来的。后来经过谷歌查询,发现standardsession的存放位置在org.apache.session.StandardSession,看到这个包名,我猜测是tomcat目录里面lib文件夹里面的jar包之一。后来经过一定的查找,发现这个类是存放在一个叫做catalina的jar里面。果然一打开jar,全部都是新世界。


网络异常,图片无法展示
|


果然找到了StandardSession这个类。


网络异常,图片无法展示
|


看到一个ConcurrentMap集合之后,就大概明白session.setAttribute的真正原理了,ConcurrentMap是一个采用了分段锁来解决线程安全的一种map类型,它的出现解决了了HashTable里面使用synchronized加锁效率低的不足之处,关于什么是分段锁,以后有时间我再写一篇文章来总结一下。


再往深处看,我们可以看到session.setattribute里面的内容:


网络异常,图片无法展示
|


嗯嗯,注入一个属性的源码实现就是这样的,那么这个方法又是怎么调用的呢?

其实这里面有涉及到一中设计模式的思想,叫做门面模式。


首先来看session的时序图:


网络异常,图片无法展示
|


 

我的理解是,首先请求到request.getsession,然后创建一个新的session对象,并且将相应的session对象存放到session容器当中。由manager来对这个容器进行保存。manager类将进行对于session的生命周期管理。


关于findsession函数,主要由ManagerBase(有些书上边说是StandardManager

,其实StandardManager是ManagerBase的子类)负责实现,里面的代码如下所示:


网络异常,图片无法展示
|


而这里面代码出现的sessions其实是这么个东西:


protected Map<String, Session> sessions = new ConcurrentHashMap();

通过findsession函数可以返回一个org.apache.catalina.Session的接口,Session这个接口里面包含了许多的属性,其中包含有HttpSession这个属性。


网络异常,图片无法展示
|


在HttpSession接口里面,包含有相应的内容,看到源码这里的时候,大概就有点熟悉的味道了。

目录
相关文章
|
9天前
|
SQL 存储 XML
常见Web漏洞分析与防范研究
在以上内容中,结合OWASP、Toptal和Brightsec等权威来源的信息,确保回答的专业性和准确性。通过图表和思维导图的方式,可以更系统地了解和记忆Web安全知识,帮助企业在实际应用中更好地防范各种安全威胁。
40 13
|
8天前
|
Kubernetes Java 持续交付
小团队 CI/CD 实践:无需运维,Java Web应用的自动化部署
本文介绍如何使用GitHub Actions和阿里云Kubernetes(ACK)实现Java Web应用的自动化部署。通过CI/CD流程,开发人员无需手动处理复杂的运维任务,从而提高效率并减少错误。文中详细讲解了Docker与Kubernetes的概念,并演示了从创建Kubernetes集群、配置容器镜像服务到设置GitHub仓库Secrets及编写GitHub Actions工作流的具体步骤。最终实现了代码提交后自动构建、推送镜像并部署到Kubernetes集群的功能。整个过程不仅简化了部署流程,还确保了应用在不同环境中的稳定运行。
40 9
|
25天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
33 6
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
73 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
2月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
166 1
|
2月前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
69 6
|
2月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
93 4
|
2月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
76 2
|
2月前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
79 0