html生成jsessionid,jsessionid是什么
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是什么相关推荐
- 为什么会有jsessionid,这个东东有什么用呢?
2019独角兽企业重金招聘Python工程师标准>>> 为什么会有jsessionid,这个东东有什么用呢? 博客分类: java 为什么会有jsessionid,这个东东有什么用呢 ...
- JSESSIONID、SESSION、cookie
所谓session可以这样理解:当与服务端进行会话时,比如说登陆成功后,服务端会为用户开壁一块内存区间,用以存放用户这次会话的一些内容,比如说用户名之类的.那么就需要一个东西来标志这个内存区间是你的而 ...
- html生成jsessionid,google-chrome – Chrome和JSESSIONID
以下问题与铬-: 我在服务器上运行Grails 1.3.7应用程序.我注意到,当我从Chrome请求静态内容(例如非动态html文件)时,Chrome会创建两个JSESSIONID-Cookies.登 ...
- Java Web开发API Boy如何进阶?
导语 | Java Web后台开发基本都离不开Spring生态这一套,Spring框架功能极其强大,会帮忙做许多工作,我们通常只需要在一个函数(包含request和response两个入参)中写处理逻 ...
- 干掉服务状态!从 Session 到 Token,复杂度降低100倍!
作者 l 会点代码的大叔(CodeDaShu) 在讲Token之前,先简单说说什么是 Session 和 Cookie. 首先要知道 HTTP 请求是无状态的: 无状态的意思就是:每一次请求都是独立的 ...
- MSM--Memcached_Session_Manager介绍及使用
我 们都知道对于一些大型的web2.0的网站,在正式部署时一般是部署在不同故障域的多台应用服务器上,以j2ee应用为例,一般我们都会部署在 tomcat下,假如我们部署了10台tomcat服务器,那这 ...
- RESTClient 用法
为什么80%的码农都做不了架构师?>>> Wisdom RESTClient 一款自动化测试REST API的工具,它可以自动化测试RESTful API并生成精美的测试报告, ...
- JSP脚本 9大内置对象
简介 JSP脚一包含9个内置对象,即JSP脚本规范对它们进行了初始化,可以直接使用. JSP内置对象的实质:request与response是对应Servlet的_jspService()方法的形参, ...
- C#模拟post消息,实现登陆功能(包括CAS系统)
这方面的文章多得很,我这里把一些细节说一下. 1. 选用C#中的HttpWebRequest.HttpWebResponse和CookieContainer类.HttpWebRequest是用来提交w ...
- uploadify在火狐下上传不了的解决方案,java版(Spring+SpringMVC+MyBatis)详细解决方案
由于技术选型的原因,在一个产品中,我选择了uploadify,选择它的原因是它有完善的技术文档说明(http://www.uploadify.com/documentation/),唯一不足的是 ...
最新文章
- iOS开发 - OC - block的详解 - 基础篇
- 重力感应的测试程序andriod源代码
- SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)
- Guns 企业版多数据源配置集成dynamic-datasource
- Objective-C和C++混编的要点
- rocket mq 监听端口_如何使用Jmeter实现MQ数据的发送和接收?性能测试实战篇
- DeepMind新突破:雷神之锤3战场AI夺旗,团战胜率超过人类
- linux vnc离线安装包,Linux之部署vnc应用
- 查看 chrome 浏览器中的 Headers
- jqgrid 使用小记——与springboot jpa 一起使用的分页,翻页。(使用springboot jpa 原生的分页)...
- PPT镂空字体、填充文字、图片字、拆分字制作
- DSP 6678的中断系统
- 显示随机森林多元回归结果
- 网易mumu模拟器的使用
- 【python】计算圆周率到任意位支持任意位(速度快)
- HTML5 列表、表格、常用表单、基本标签
- MATLAB APP设计
- unittest篇3-测试套件(TestSuite)详解
- 音视频基础知识-时间戳的理解
- linux etc目录讲解
热门文章
- VS+Qt应用开发-设置鼠标光标
- TwinCAT3入门使用经验
- python爬取微博评论_python爬虫手把手教你抓取微博评论(完整代码)
- 泰克示波器入门级TBS1102C+电流探头TCP2020方案
- 几款不错的整站下载工具
- pxe无盘服务器教程,[教程]Synology+PXE挂载iSCSI网络无盘启动Win7(08.04更新)
- head first系列pdf下载
- Objective C 获取当前日期时间方法
- php实现 令牌桶,php 基于redis使用令牌桶算法实现流量控制
- 以虎丘塔影园的数字化项目,窥考古与实景三维的异业合作