jsessionid是一个Cookie,可以通过在URL后面加上“;jsessionid=xxx”来传递“session id”;其中Servlet容器用来记录用户session,当我们创建回话时会自动创建,用来记录用户的访问记录。

首先,JSESSIONID是一个Cookie,Servlet容器(tomcat,jetty)用来记录用户session。

什么时候种下JSESSIONID

创建会话时,即调用request.getSession()的时候,关于getSession就不说了。补充几点是,访问html是不会创建session的,JSP页面默认是会创建session的,可以在JSP页面里面关掉自动创建session.

JSESSIONID工作原理:

URL重写

服务端在内存里创建session,需要种Cookie,除了在request header里面设置Set-Cookie以外,tomcat等容器有一个URL重写机制。这个机制是客户端Cookie不可用时的一个兜底策略,通过在URL后面加上;jsessionid=xxx来传递session id,这样即使Cookie不可用时,也可以保证session的可用性,但是session暴露在URL里,本身是不安全的,到这里基本网上说法都是一致的

但是最关键的问题,tomcat怎么知道客户端Cookie不可用。我在idea导入tomcat的源码调试跟踪,不同版本有些出入,大致应该还是一样的

tomcat有一个org.apache.catalina.connector.Response是Response的落地类,有两个方法会进行URL重写,分别是encodeRedirectURL和encodeURL,encodeRedirectURL是重定向时会被调用,encodeURL貌似是手动调用,所以默认情况,重定向时才会出现URL重写。两个方法代码类似,下面只关注encodeRedirectURL/**

* Encode the session identifier associated with this response

* into the specified redirect URL, if necessary.

*

* @param url URL to be encoded

* @return true if the URL was encoded

*/

@Override

public String encodeRedirectURL(String url) {

if (isEncodeable(toAbsolute(url))) {

return (toEncoded(url, request.getSessionInternal().getIdInternal()));

} else {

return (url);

}

}

方法注释写得很清楚了,如果有必要的话,把session id塞到重定向的URL里面。再看一下isEncodeable方法,关键地方我加了中文注释/**

* Return true if the specified URL should be encoded with

* a session identifier. This will be true if all of the following

* conditions are met:

*

*

The request we are responding to asked for a valid session

*

The requested session ID was not received via a cookie

*

The specified URL points back to somewhere within the web

* application that is responding to this request

*

*

* @param location Absolute URL to be validated

* @return true if the URL should be encoded

*/

protected boolean isEncodeable(final String location) {

if (location == null) {

return false;

}

// Is this an intra-document reference?

if (location.startsWith("#")) {

return false;

}

// Are we in a valid session that is not using cookies?

final Request hreq = request;

final Session session = hreq.getSessionInternal(false);

if (session == null) {

return false;

}

//这里其实就是网上说的客户端禁用Cookie

if (hreq.isRequestedSessionIdFromCookie()) {

return false;

}

// Is URL encoding permitted

// servlet3.0后可以在项目web.xml里关掉URL重写,对应tomat7之后

if (!hreq.getServletContext().getEffectiveSessionTrackingModes().

contains(SessionTrackingMode.URL)) {

return false;

}

if (SecurityUtil.isPackageProtectionEnabled()) {

return (

AccessController.doPrivileged(new PrivilegedAction() {

@Override

public Boolean run(){

return Boolean.valueOf(doIsEncodeable(hreq, session, location));

}

})).booleanValue();

} else {

//这个方法会重写URL

return doIsEncodeable(hreq, session, location);

}

}

其中调用Request对象的isRequestedSessionIdFromCookie判断客户端Cookie是否可用,里面逻辑也很简单,就是读取request里面有没有传JSESSIONID这个Cookie。所以网上有些人说第一次访问,其实只要客户端没有传JSESSIONID,tomcat都假定Cookie不可用

html生成jsessionid,jsessionid是什么相关推荐

  1. 为什么会有jsessionid,这个东东有什么用呢?

    2019独角兽企业重金招聘Python工程师标准>>> 为什么会有jsessionid,这个东东有什么用呢? 博客分类: java 为什么会有jsessionid,这个东东有什么用呢 ...

  2. JSESSIONID、SESSION、cookie

    所谓session可以这样理解:当与服务端进行会话时,比如说登陆成功后,服务端会为用户开壁一块内存区间,用以存放用户这次会话的一些内容,比如说用户名之类的.那么就需要一个东西来标志这个内存区间是你的而 ...

  3. html生成jsessionid,google-chrome – Chrome和JSESSIONID

    以下问题与铬-: 我在服务器上运行Grails 1.3.7应用程序.我注意到,当我从Chrome请求静态内容(例如非动态html文件)时,Chrome会创建两个JSESSIONID-Cookies.登 ...

  4. Java Web开发API Boy如何进阶?

    导语 | Java Web后台开发基本都离不开Spring生态这一套,Spring框架功能极其强大,会帮忙做许多工作,我们通常只需要在一个函数(包含request和response两个入参)中写处理逻 ...

  5. 干掉服务状态!从 Session 到 Token,复杂度降低100倍!

    作者 l 会点代码的大叔(CodeDaShu) 在讲Token之前,先简单说说什么是 Session 和 Cookie. 首先要知道 HTTP 请求是无状态的: 无状态的意思就是:每一次请求都是独立的 ...

  6. MSM--Memcached_Session_Manager介绍及使用

    我 们都知道对于一些大型的web2.0的网站,在正式部署时一般是部署在不同故障域的多台应用服务器上,以j2ee应用为例,一般我们都会部署在 tomcat下,假如我们部署了10台tomcat服务器,那这 ...

  7. RESTClient 用法

    为什么80%的码农都做不了架构师?>>>    Wisdom RESTClient 一款自动化测试REST API的工具,它可以自动化测试RESTful API并生成精美的测试报告, ...

  8. JSP脚本 9大内置对象

    简介 JSP脚一包含9个内置对象,即JSP脚本规范对它们进行了初始化,可以直接使用. JSP内置对象的实质:request与response是对应Servlet的_jspService()方法的形参, ...

  9. C#模拟post消息,实现登陆功能(包括CAS系统)

    这方面的文章多得很,我这里把一些细节说一下. 1. 选用C#中的HttpWebRequest.HttpWebResponse和CookieContainer类.HttpWebRequest是用来提交w ...

  10. uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案

     由于技术选型的原因,在一个产品中,我选择了uploadify,选择它的原因是它有完善的技术文档说明(http://www.uploadify.com/documentation/),唯一不足的是 ...

最新文章

  1. iOS开发 - OC - block的详解 - 基础篇
  2. 重力感应的测试程序andriod源代码
  3. SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)
  4. Guns 企业版多数据源配置集成dynamic-datasource
  5. Objective-C和C++混编的要点
  6. rocket mq 监听端口_如何使用Jmeter实现MQ数据的发送和接收?性能测试实战篇
  7. DeepMind新突破:雷神之锤3战场AI夺旗,团战胜率超过人类
  8. linux vnc离线安装包,Linux之部署vnc应用
  9. 查看 chrome 浏览器中的 Headers
  10. jqgrid 使用小记——与springboot jpa 一起使用的分页,翻页。(使用springboot jpa 原生的分页)...
  11. PPT镂空字体、填充文字、图片字、拆分字制作
  12. DSP 6678的中断系统
  13. 显示随机森林多元回归结果
  14. 网易mumu模拟器的使用
  15. 【python】计算圆周率到任意位支持任意位(速度快)
  16. HTML5 列表、表格、常用表单、基本标签
  17. MATLAB APP设计
  18. unittest篇3-测试套件(TestSuite)详解
  19. 音视频基础知识-时间戳的理解
  20. linux etc目录讲解

热门文章

  1. VS+Qt应用开发-设置鼠标光标
  2. TwinCAT3入门使用经验
  3. python爬取微博评论_python爬虫手把手教你抓取微博评论(完整代码)
  4. 泰克示波器入门级TBS1102C+电流探头TCP2020方案
  5. 几款不错的整站下载工具
  6. pxe无盘服务器教程,[教程]Synology+PXE挂载iSCSI网络无盘启动Win7(08.04更新)
  7. head first系列pdf下载
  8. Objective C 获取当前日期时间方法
  9. php实现 令牌桶,php 基于redis使用令牌桶算法实现流量控制
  10. 以虎丘塔影园的数字化项目,窥考古与实景三维的异业合作