好久没写博客了,一直没什么好写的,最近碰到JSESSIONID这个问题,网上的说法有点模糊,特别是什么时候会出现URL重写这个问题,有些说客户端禁用Cookie,有些说第一次访问,这里总结一下

JSESSIONID是什么

老实说一开始看到这个有点懵,写Java这么久没看过这东西。

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

什么时候种下JSESSIONID

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

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不可用

java jsessionid_关于JSESSIONID相关推荐

  1. 网络请求中的cookie与set-Cookie的交互模式和作用

    首先我们需要思考,很多问题. 1.当很多人访问统一网络服务器,服务器如何来区分不同的用户呢? 答:sessionid,sessionid保证了浏览器和服务器唯一性的通信凭证号码,session保存在服 ...

  2. Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解

    引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: han ...

  3. 深信服应用交付(AD)学习笔记

    深信服上网行为管理的学习笔记,由于软件版本更新相关特性可能变动,仅供参考哈.. 权威内容请访问深信服官方社区:https://bbs.sangfor.com.cn/ 目录 DNS相关 全局智能DNS ...

  4. 【nginx 扩容及常用模块扩展】

    Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM.浪潮.DELL.HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘: ...

  5. 攻击JavaWeb应用————2、CS交互安全

    注:本节意在让大家了解客户端和服务器端的一个交互的过程,我个人不喜欢xss,对xss知之甚少所以只能简要的讲解下.这一节主要包含HttpServletRequest.HttpServletRespon ...

  6. 转:攻击JavaWeb应用[2]-CS交互安全

    转:http://static.hx99.net/static/drops/tips-164.html 攻击JavaWeb应用[2]-CS交互安全 园长 · 2013/07/08 14:54 注:本节 ...

  7. 攻击JavaWeb应用[2]-CS交互安全

    园长 · 2013/07/08 14:54 注:本节意在让大家了解客户端和服务器端的一个交互的过程,我个人不喜欢xss,对xss知之甚少所以只能简要的讲解下.这一节主要包含HttpServletReq ...

  8. Cookie管理 WebView同步

    NoHttp的Cookie管理原理 在文档的初始化配置一章讲了NoHttp如何配置或者禁用cookie自动管理. NoHttp的Cookie自动维护,严格遵守Http协议,即区分临时Cookie和有效 ...

  9. 小滴课堂-新版JavaWeb零基础到实战专题课程-9

    目录 前言 第九章 玩转会话跟踪技术Cookie 和 session 第1集 会话跟踪技术之什么是Cookie 第2集 javaweb开发核心之Cookie实战 第3集 Web开发必备知识之Sessi ...

  10. Android面试大总结

    面试题:你似乎来到了没有知识存在的荒原 - 知乎 字节跳动Android面试题目与答案(2020) 2020年开春最新面试!字节跳动安卓面试题及答案 (已拿到 offer) Android面试必备26 ...

最新文章

  1. 爱立信为T-Mobile荷兰全新的OTT TV业务提供强大支持
  2. 如何屏蔽VS2013中的4996错误!
  3. php模拟表格冻结,PHPExcel冻结(锁定)表头的简单实现方法
  4. c语言指针底层实现,C语言二级指针底层实现
  5. 10.02 T3 打表找递推式+十进制快速幂 九校联考凉心模拟DAY1T1
  6. 同名字的数值求和插入行_中望CAD2021:支持表格和字段插入公式,提高数据处理效率...
  7. ASP.NET MVC系列:UrlRouting
  8. gulp压缩css文件夹,使用 gulp 压缩 CSS
  9. 【报告分享】阿里妈妈:熬夜真相-0点经济报告.pdf(附下载链接)
  10. Web上的支持的图片格式以及它们之间的区别
  11. TCP/IP 各层的作用
  12. ORM框架之Mybatis(六)mybatis通用mapper
  13. java中resultset的previous_在 Java中,已获得默认类型的ResultSet对象rs,要获得结果集中的数据,必须执行的语句是( )。_学小易找答案...
  14. 自制能自动加载所需RAID驱动的Windows PE系统来安装服务器系统
  15. ReentrantLock加锁解锁线程入队源码分析
  16. 网易严选小程序 ( 前端 ):mpvue-shop
  17. 独特性,就是你最好的竞争力
  18. JUC并发编程学习笔记
  19. 当520遇到MicroPython,单身极客狗也能很开“芯”~
  20. [学习记录]浅谈Android硬件加速

热门文章

  1. Java的文件读写操作
  2. echarts实现省份迁徙图
  3. 【学习笔记】简单的连通性状压DP——插头DP(不学以为是天书)
  4. 读书笔记_打开量化投资的黑箱05
  5. 爬虫第六篇:scrapy框架爬取某书网整站爬虫爬取
  6. matlab 传函将s换为jw,已知单位负反馈系统开环传递函数为20 s(0.5s 1),
  7. 深度linux操作系统怎么样,深度Deepin国产操作系统使用体验报告!
  8. 从零开始学java系列第一季第一期:简单的了解java并安装jdk以及环境配置
  9. Unity 导入原神人物模型
  10. wav音频文件转为c语言代码程序 1.0 简体绿色版,WAV音频单声道提取工具下载