java jsessionid_关于JSESSIONID

java jsessionid_关于JSESSIONID好久没写博客了 一直没什么好写的 最近碰到 JSESSIONID 这个问题 网上的说法有点模糊 特别是什么时候会出现 URL 重写这个问题 有些说客户端禁用 Cookie 有些说第一次访问 这里总结一下 JSESSIONID 是什么老实说一开始看到这个有点懵 写 Java 这么久没看过这东西 首先 JSESSIONID 是一个 Cookie Servlet 容器 tomcat jetty 用来记录用户 session 什么

好久没写博客了,一直没什么好写的,最近碰到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不可用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215368.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:04
下一篇 2026年3月18日 下午2:05


相关推荐

  • 在Cursor运行Qt工程——从环境配置到运行

    在Cursor运行Qt工程——从环境配置到运行

    2026年3月15日
    3
  • 小米商标转让背后的智能助手布局

    小米商标转让背后的智能助手布局

    2026年3月12日
    3
  • git命令之git clone用法

    git命令之git clone用法 2015年02月26日13:59:11阅读数:81047转:http://blog.csdn.net/wangjia55/article/details/8818845 在使用git来进行版本控制时,为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(GitURL).Git能在许多协议下使用,所以Git URL可能以ssh://,http(s)://,…

    2022年5月8日
    65
  • 分别用冒泡法和选择法对10个整数排序_c语言数组从大到小冒泡排序

    分别用冒泡法和选择法对10个整数排序_c语言数组从大到小冒泡排序1.区别:      两者最大的区别在于算法本身。       冒泡法是相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可以作相对位置的调整。可以进行升序或降序排序。        选择法是每趟选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。可进行降序排序或升序排序。2.冒泡法:…

    2022年10月19日
    5
  • MySQL binlog日志格式 binlog_format[通俗易懂]

    MySQL binlog日志格式 binlog_format[通俗易懂]MySQLbinlog日志格式binlog_formatMySQL5.5中对于二进制日志(binlog)有3种不同的格式可选:Mixed,Statement,Row,默认格式是Statement。总结一下这三种格式日志的优缺点。MySQLReplication复制可以是基于一条语句(StatementLevel),也可以是基于一条记录(RowLevel),可以…

    2022年5月31日
    34
  • 基于ARM的嵌入式大容量数据存储解决方案「建议收藏」

    基于ARM的嵌入式大容量数据存储解决方案「建议收藏」恒颐成功案例   *  某单位舰载信息黑匣子;   *  消防主机监控与采集终端;应用背景  随着32位嵌入式微处理器的推广使用,越来越多的应用场合需要大容量的数据存储解决方案,传统的基于U盘、硬盘、SD/MMC卡存储方案,虽然也能实现大容量数据存储的功能,但无论是系统体积、成本、功耗、可靠性和易用性等方面都不尽如人意,因此,迫切需要一种能以较低的成本、功耗和体积,实现大容量、高

    2022年10月7日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号