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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 观察者模式写的Log打印

    观察者模式写的Log打印

    2021年7月3日
    94
  • conda 安装whl_whl文件是什么

    conda 安装whl_whl文件是什么里写自定义目录标题)conda安装本地whl文件(opencv,pytorch,torchvision等)因为在线安装总是遇到报错,就直接离线下载安装离线安装报错可能是因为代理没关,下图下载torch,torchvision离线文件网址:https://download.pytorch.org/whl/torch_stable.html里面有cpu和GPU版本的离线文件,下载对应版本(gpu版本要对应cuda)下载好之后,打开Anacondaprompt建一个专门的环境,我已经建好

    2022年10月19日
    4
  • irr模型不足_SVM模型

    irr模型不足_SVM模型LR模型常见问题小议标签:LR机器学习2016-01-1023:33671人阅读评论(0)收藏举报本文章已收录于:分类:机器学习(10)作者同类文章X版权声明:本文为博主原创文章,转载请注明出处。目录(?)[+]数据归一化特征离散化组合

    2022年10月12日
    2
  • Java-反射机制(超详解)「建议收藏」

    Java-反射机制(超详解)「建议收藏」Java反射机制概述一、Java反射机制概述1.JavaReflection2.动态语言vs静态语言二、理解Class类并获取Class的实例1.概述2.方法3.哪些类型可以有Class对象?4.获取Class类的实例(四种方法)三、类的加载与ClassLoader的理解1.类的加载过程2.什么时候会发生类初始化?3.类加载器的作用4.JVM中不同类型的类的加载器5.6.Properties:用来读取配置文件。四、创建运行时类的对象五、获取运行时类的完整结构1.获取当前

    2025年11月19日
    4
  • ubuntu16.04.3安装教程_Ubuntu16下安装QQ

    ubuntu16.04.3安装教程_Ubuntu16下安装QQUbuntu16.04.1安装NginxNginx(“enginex”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx是由IgorSysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集

    2025年12月4日
    2
  • vc 获取月份的天数_根据距离1900年1月1日的天数(0起始),计算这一天的日期(年,月,日)…

    vc 获取月份的天数_根据距离1900年1月1日的天数(0起始),计算这一天的日期(年,月,日)…我的代码,算法不优美,但结果正确^_^#include#include#includevoidfoo(int&year,int&month,int&day){year=1900;month=1;day+=0;for(intn;n=(((year%4==0&&year%100!=0)||(year%400==0))…

    2022年8月12日
    9

发表回复

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

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