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吗?相关推荐

  1. java增删改查_Java程序员你真的甘心只做增删改查吗

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 最 ...

  2. 程序员你真的理解final关键字吗?

    文章目录 1.修饰类 2.修饰方法 3.修饰变量 4.final变量修饰变量(成员变量.局部变量) 4.1 final修饰成员变量: 4.2 final修饰局部变量: 5.final变量和普通变量的区 ...

  3. 【职场】你做程序员,真的是因为热爱吗?

    今天的这一期,我们不聊技术,我们来聊一聊我们做程序员的初心,以及如何才能高效的学习编程和技术~ 01 你的初心 前一阵子,圈子里的一位知名的博主从老东家离职了,离职的视频看了一遍,尤其是其中他的一句话 ...

  4. 想要成为真正优秀的程序员是不是真的很难?

    很多人认为要想成为一名优秀的程序员,那就需要一天24小时每天不断地编程--睁开眼睛要编程,闭上眼睛睡觉的时候还要梦到编程--我认为这是一种矫枉过正的方法.沿着这条路走,只会让你精疲力尽,犹如夸父逐日一 ...

  5. 一有问题,就想依靠别人,这根本不能算程序员。真的是代码民工。

    若想找老师,或者是想找人问,这本身就是不对的,程序员是最好的职业,前提是合格的程序员,现在很多人,一有问题,就想依靠别人,这根本不能算程序员.真的是代码民工.

  6. 程序员职业生涯真的很短吗?

    点击蓝字 关注我们 程序员职业生涯真的很短吗?是吃青春饭吗?35+ 岁真的会被优化吗?--在某乎上一搜"程序员",全是这类回答. 对于程序员,年龄真的是最大的威胁吗?其实并不是! ...

  7. android仿秒拍源码,你所不知道的程序员 程序员其实真的很…【Bus Weekly】三十六期...

    原标题:你所不知道的程序员 程序员其实真的很-[Bus Weekly]三十六期 快,点击蓝色"字体"关注这个公众号,一起涨姿势- 现如今,程序员在中国的科技 圈可以说已经达到了举足 ...

  8. 作为程序员你真的清楚数据结构吗

    作为程序员你真的清楚数据结构吗 ✨博主介绍 :bamboo:什么是数据结构 线性表和链表 链表与单链表介绍 单链表的应用 双向链表 环形链表

  9. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

    java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...

最新文章

  1. mcs 4微型计算机,MCS-II高性能自主品牌的微机测速仪
  2. Express.js 3.0 发布,Node.js 的高性能封装
  3. 我的DWR学习(一)
  4. adf4351使用_使用ADF BC管理保存点
  5. 基于RTP的QOS算法简介
  6. linux 文件理解,linux文件系统理解
  7. JAVA包装类及自动封包解包示例代码
  8. es创建索引库报错 :Types cannot be provided in put mapping requests, unless the include_type_na
  9. 【UVA1599】Ideal Path理想路径--两种约束条件(!!双向bfs+非简单图的最短路+无向图邻接记录法)
  10. strdup linux,内存管理 – Linux内核API kstrdup
  11. 万字精选长文,深入解读房地产土地投资测算路径(附下载)
  12. 完成端口(Completion Port)详解
  13. smartdns 部署最佳实践
  14. 三次根号 matlab,MATLAB求三次根号,怎么是错误的?
  15. word排版技巧:如何撤销删除自动编号
  16. softice 常用操作
  17. 学说话:和光合作用五道口店咖啡吧的小姑娘过招儿;推荐:《如何听如何说》 - [学说话]
  18. rz安装 xshell_Linux与windows之间文件传输工具RZSZ安装(Xshell或CRT)
  19. 【智能制造】智能制造与智能工厂的主要特征
  20. iOS培训机构该如何选择之浅析

热门文章

  1. 康柏川(帮别人名字作诗)
  2. [编程题]数独(JAVA)
  3. 【elasticsearch系列】安装elasticsearch-head插件
  4. 【Drools三】打工人学习Drools高级语法
  5. oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数
  6. 线性代数:特殊矩阵学习笔记
  7. CentOS设置永久静态路由
  8. 网格成就Web 2.0存储时代的路易XIV?
  9. 苏格拉底婚姻_苏格拉底如何教我与开发人员交谈
  10. raspberry pi_如何在Raspberry Pi上使用LÖVE游戏引擎对游戏进行编程