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


相关推荐

  • 呼叫中心坐席功能都有哪些?

    呼叫中心坐席功能都有哪些?IPCC是IP呼叫中心(IPCallCenter)的简称,本质上是以IP技术和IP语音为主要应用技术的呼叫中心构建方式,即利用IP传输网来传输与交换语音、图像和文本等信息。(摘自百度百科)

    2022年6月30日
    25
  • vue $attrs的使用

    vue $attrs的使用$attrs的使用vue$attrs是在vue的2.40版本以上添加的。项目中有多层组件传参可以使用$attrs,可以使代码更加美观,更加简洁,维护代码的时候更方便。如果使用普通的父子组件传参prop和$emit,$on会很繁琐;如果使用vuex会大材小用,只是在这几个组件中使用,没必要使用vuex;使用事件总线eventBus,使用不恰当的话,有可能会出现事件多次执行。如果给组件传递…

    2022年10月18日
    3
  • 灰色关联度分析(Grey Relation Analysis,GRA)原理详解[通俗易懂]

    灰色关联度分析(Grey Relation Analysis,GRA)原理详解[通俗易懂]释名灰色关联度分析(GreyRelationAnalysis,GRA),是一种多因素统计分析的方法。简单来讲,就是在一个灰色系统中,我们想要了解其中某个我们所关注的某个项目受其他的因素影响的相对强弱,再直白一点,就是说:我们假设以及知道某一个指标可能是与其他的某几个因素相关的,那么我们想知道这个指标与其他哪个因素相对来说更有关系,而哪个因素相对关系弱一点,依次类推,把这些因素排个序,得到一个…

    2022年7月17日
    16
  • Windows下搭建Spark+Hadoop开发环境

    Windows下搭建Spark+Hadoop开发环境

    2022年3月2日
    60
  • PyCharm下使用 ipython 交互式编程「建议收藏」

    PyCharm下使用 ipython 交互式编程「建议收藏」目的:方便调试,查看中间结果,因为觉得设断点调试相对麻烦。【运行环境:macOS10.13.3,PyCharm 2017.2.4】老手:选中代码行,Alt+Shift+E。或选中,鼠标右键-ExecuteLineinConsole。新手:1、安装ipython之后,查看 PyCharm 设置,确保Console的通用设置UseIPythonifavailable选项打勾。…

    2022年8月25日
    5
  • Python对字典根据键值分组进行排序

    Python对字典根据键值分组进行排序

    2021年11月22日
    70

发表回复

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

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