深入分析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接口里面,包含有相应的内容,看到源码这里的时候,大概就有点熟悉的味道了。

目录
相关文章
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
362 1
|
2月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
323 0
|
3月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
483 64
|
3月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
305 1
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
215 4
|
5月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
5月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
5月前
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
252 104
|
5月前
|
JavaScript 前端开发 API
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
本文介绍了HarmonyOS应用开发中的HML、CSS和JS语法。HML作为标记语言,支持数据绑定、事件处理、列表渲染等功能;CSS用于样式定义,涵盖尺寸单位、样式导入、选择器及伪类等特性;JS实现业务逻辑,包括ES6语法支持、对象属性、数据方法及事件处理。通过具体代码示例,详细解析了页面构建与交互的实现方式,为开发者提供全面的技术指导。
269 104
下一篇
oss云网关配置