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/129560.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WiFi网络WPA2 KRACK漏洞分析报告「建议收藏」

    WiFi网络WPA2 KRACK漏洞分析报告「建议收藏」作者:阿里安全技术平台团队————————0x00漏洞概述安全研究员MathyVanhoef发现的WPA2协议的KRA(KeyReinstallationAttacks)漏洞,利用WPA2协议标准加密密钥生成机制上的设计缺陷,四次握手协商加密密钥过程中第三个消息报文可被篡改重放,导致在用密钥被重新安装。WiFi网络通过WPA…

    2022年6月10日
    48
  • leetcode-11盛最多水的容器「建议收藏」

    leetcode-11盛最多水的容器「建议收藏」原题链接给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输入:he

    2022年8月8日
    6
  • idea2021.1.4激活码【最新永久激活】

    (idea2021.1.4激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS3…

    2022年3月26日
    256
  • pytest的assert_assert中文

    pytest的assert_assert中文前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

    2022年7月31日
    6
  • PHP+AJAX 实现表格实时编辑

    PHP+AJAX 实现表格实时编辑

    2021年11月3日
    48
  • sublime 激活码【2021最新】

    (sublime 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~M…

    2022年3月21日
    87

发表回复

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

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