ajax获取session值_java程序员你真的了解session与cookie吗?
1.基础:
session信息是保存在服务器端,而cookie是保存在客户端(浏览器),这个是最基础的概念,如果你这一点都不知道,再去查查资料再往下读。
具体的js、java相关的session与cookie的操作,这里也不在赘述,可以百度之,这里只讲理论。
2.客户端与服务服端交互:
以下提到的“sessionid”只是一个理论上的代号,具体的实现如tomcat的默认sessionId叫:JSESSIONID当然你可以在配置文件中修改这个key,不要把sessionid当做是具体的字段只是一个理论上的代号。
想要得到session信息需要通过session的id在服务器内存中获取,当然第一次客户端访问服务器是没有对应的session信息,第一次服务端需要新建session对象然后把sessionid返回给客户端(这时sessionid存储在cookie中)。
客户端请求服务器的时会带着cookie信息到服务端,cookie里面存储的有sessionid,服务端通过请求信息中的cookie信息得到sessionid再根据sessionid从内存中获取session信息。
所以说如果浏览器禁用cookie也就是说客户端访问服务器,服务器端获取不到cookie信息,因此也获取不到sessionid信息,最终的结果是获取不到session信息(这里忽略通过url传递sessionid这种方法,因为很少人会用这种方法)。如果浏览器禁用cookie有些需要登录的网站就无法获取session信息,无法验证登录信息,此时不能登录网站。
可以试验一下,禁用浏览器的cookie(不同类型的浏览器禁用方法不同),大部分网站都无法登录。
3.具体实现:
服务器获取session信息用request.getSession()方法,可以看一下底层是怎么实现的。
以tomcat为例
RequestFacade类的getsession方法,需下载tomcat的catalina.jar的源码或者反编译
方法中调用的是Request的getsession方法再往下找
很明显服务端是根据sessionid从内存中取,这里只截取关键代码,如果感兴趣可以下载tomcat源码详细看
在往下看requestSessionId是怎样来的:
很明显上图看到是遍历了cookie的值获取sessionid,再往下看一下tomcat中sessionId在cookie中的key值:
public static final String SESSION_COOKIE_NAME =
System.getProperty("org.apache.catalina.SESSION_COOKIE_NAME", "JSESSIONID");
很明显是JSESSIONID;
所以我们在浏览器调试的时候看到的cookie中的JSESSIONID的值就是服务端的sessionid。
以上验证方法可以找一个网站登录,登录之后用浏览器F12查看cookie信息里面有JSESSIONID的信息。
注意:静态资源不通过servlet可以访问的资源,明显的是不会经过服务端的代码处理,所以不会有sessionid相关的信息。
下面把tomcat生成sessionid的方法粘贴出来,有兴趣可以深入研究一下:
protected synchronized String generateSessionId(){byte[] random = new byte[16];String jvmRoute = getJvmRoute();String result = null;StringBuffer buffer = new StringBuffer();do{int resultLenBytes = 0;if (result != null){buffer = new StringBuffer();this.duplicates += 1;}for (; resultLenBytes < this.sessionIdLength; goto 73){getRandomBytes(random);random = getDigest().digest(random);int j = 0;if ((j < random.length) && (resultLenBytes < this.sessionIdLength)){byte b1 = (byte)((random[j] & 0xF0) >> 4);byte b2 = (byte)(random[j] & 0xF);if (b1 < 10) {buffer.append((char)(48 + b1));} else {buffer.append((char)(65 + (b1 - 10)));}if (b2 < 10) {buffer.append((char)(48 + b2));} else {buffer.append((char)(65 + (b2 - 10)));}resultLenBytes++;j++;}}if (jvmRoute != null) {buffer.append('.').append(jvmRoute);}result = buffer.toString();} while (this.sessions.containsKey(result));return result;}
ajax获取session值_java程序员你真的了解session与cookie吗?相关推荐
- java增删改查_Java程序员你真的甘心只做增删改查吗
各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 最 ...
- 程序员你真的理解final关键字吗?
文章目录 1.修饰类 2.修饰方法 3.修饰变量 4.final变量修饰变量(成员变量.局部变量) 4.1 final修饰成员变量: 4.2 final修饰局部变量: 5.final变量和普通变量的区 ...
- 【职场】你做程序员,真的是因为热爱吗?
今天的这一期,我们不聊技术,我们来聊一聊我们做程序员的初心,以及如何才能高效的学习编程和技术~ 01 你的初心 前一阵子,圈子里的一位知名的博主从老东家离职了,离职的视频看了一遍,尤其是其中他的一句话 ...
- 想要成为真正优秀的程序员是不是真的很难?
很多人认为要想成为一名优秀的程序员,那就需要一天24小时每天不断地编程--睁开眼睛要编程,闭上眼睛睡觉的时候还要梦到编程--我认为这是一种矫枉过正的方法.沿着这条路走,只会让你精疲力尽,犹如夸父逐日一 ...
- 一有问题,就想依靠别人,这根本不能算程序员。真的是代码民工。
若想找老师,或者是想找人问,这本身就是不对的,程序员是最好的职业,前提是合格的程序员,现在很多人,一有问题,就想依靠别人,这根本不能算程序员.真的是代码民工.
- 程序员职业生涯真的很短吗?
点击蓝字 关注我们 程序员职业生涯真的很短吗?是吃青春饭吗?35+ 岁真的会被优化吗?--在某乎上一搜"程序员",全是这类回答. 对于程序员,年龄真的是最大的威胁吗?其实并不是! ...
- android仿秒拍源码,你所不知道的程序员 程序员其实真的很…【Bus Weekly】三十六期...
原标题:你所不知道的程序员 程序员其实真的很-[Bus Weekly]三十六期 快,点击蓝色"字体"关注这个公众号,一起涨姿势- 现如今,程序员在中国的科技 圈可以说已经达到了举足 ...
- 作为程序员你真的清楚数据结构吗
作为程序员你真的清楚数据结构吗 ✨博主介绍 :bamboo:什么是数据结构 线性表和链表 链表与单链表介绍 单链表的应用 双向链表 环形链表
- oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...
最新文章
- mcs 4微型计算机,MCS-II高性能自主品牌的微机测速仪
- Express.js 3.0 发布,Node.js 的高性能封装
- 我的DWR学习(一)
- adf4351使用_使用ADF BC管理保存点
- 基于RTP的QOS算法简介
- linux 文件理解,linux文件系统理解
- JAVA包装类及自动封包解包示例代码
- es创建索引库报错 :Types cannot be provided in put mapping requests, unless the include_type_na
- 【UVA1599】Ideal Path理想路径--两种约束条件(!!双向bfs+非简单图的最短路+无向图邻接记录法)
- strdup linux,内存管理 – Linux内核API kstrdup
- 万字精选长文,深入解读房地产土地投资测算路径(附下载)
- 完成端口(Completion Port)详解
- smartdns 部署最佳实践
- 三次根号 matlab,MATLAB求三次根号,怎么是错误的?
- word排版技巧:如何撤销删除自动编号
- softice 常用操作
- 学说话:和光合作用五道口店咖啡吧的小姑娘过招儿;推荐:《如何听如何说》 - [学说话]
- rz安装 xshell_Linux与windows之间文件传输工具RZSZ安装(Xshell或CRT)
- 【智能制造】智能制造与智能工厂的主要特征
- iOS培训机构该如何选择之浅析
热门文章
- 康柏川(帮别人名字作诗)
- [编程题]数独(JAVA)
- 【elasticsearch系列】安装elasticsearch-head插件
- 【Drools三】打工人学习Drools高级语法
- oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数
- 线性代数:特殊矩阵学习笔记
- CentOS设置永久静态路由
- 网格成就Web 2.0存储时代的路易XIV?
- 苏格拉底婚姻_苏格拉底如何教我与开发人员交谈
- raspberry pi_如何在Raspberry Pi上使用LÖVE游戏引擎对游戏进行编程