`

resin的session id reuse特性(2)--分析问题

    博客分类:
  • web
Web 
阅读更多
    上文中详细描述了问题的表现情况,由于这个特性严重影响到目前为公司设计的一套前台统一认证方案,因此不得不特别关注。好在resin的源代码是公开的,直接从resin的官网将resin的源代码拿下来,看resin到底是如何处理的。

首先找到com.caucho.server.http.HttpRequest,发现是extends AbstractHttpRequest
在AbstractHttpRequest中找到方法
  public HttpSession getSession(boolean create)

        发现调用
_session = createSession(create, hasOldSession);
    这里有一段注释解释了重用jsessonid的行为:
        Must accept old ids because different applications in the same server must share the same cookie
        But, if the session group doesn't match, then create a new session.

  在createSession方法中找到
  manager.createSession(id, now, this, _isSessionIdFromCookie);


  打开com.caucho.server.session.SessionManager的createSession()方法,
  发现有注释: @param oldId the id passed to the request.  Reuse if possible.

  看代码:
  String id = oldId;

    if (id == null || id.length() < 4 ||
        ! isInSessionGroup(id) || ! reuseSessionId(fromCookie)) {
      id = createSessionId(request, true);
    }

    SessionImpl session = create(id, now, true);



        我们关注! reuseSessionId(fromCookie)这句,打开看函数
   /**
   * True if the server should reuse the current session id if the
   * session doesn't exist.
   */
  public boolean reuseSessionId(boolean fromCookie)
  {
    int reuseSessionId = _reuseSessionId;
  
    return reuseSessionId == TRUE || fromCookie && reuseSessionId == COOKIE;
  }

  注:非常不喜欢resin的这种代码风格,一般我宁可写成下面的这种,看代码时容易理解
  return (reuseSessionId == TRUE) || (fromCookie && (reuseSessionId == COOKIE));
        再看
/**
   * True if the server should reuse the current session id if the
   * session doesn't exist.
   */
  public void setReuseSessionId(String reuse)
    throws ConfigException
  {
    if (reuse == null)
      _reuseSessionId = COOKIE;
    else if (reuse.equalsIgnoreCase("true") ||
         reuse.equalsIgnoreCase("yes") ||
         reuse.equalsIgnoreCase("cookie"))
      _reuseSessionId = COOKIE;
    else if (reuse.equalsIgnoreCase("false") || reuse.equalsIgnoreCase("no"))
      _reuseSessionId = FALSE;
    else if (reuse.equalsIgnoreCase("all"))
      _reuseSessionId = TRUE;
    else
      throw new ConfigException(L.l("'{0}' is an invalid value for reuse-session-id.  'true' or 'false' are the allowed values.",
                    reuse));
  }

      并且可以看到默认值为COOKIE
private int _reuseSessionId = COOKIE;
  
    翻一下resin的文档,可以发现在resin.conf的<session-config>有reuse-session-id这个配置项,resin文档的说明如下:
  
    "reuse-session-id defaults to true so that Resin can share the session id amongst different web-apps."
  
    默认情况下reuse-session-id设置为true,setReuseSessionId("true")会使得_reuseSessionId=COOKIE,而reuseSessionId()方法中的表达式可以简化:
    (reuseSessionId == TRUE) || (fromCookie && (reuseSessionId == COOKIE));
    -->  (COOKIE == TRUE) || (fromCookie && (COOKIE == COOKIE))
    --> (false) || (fromCookie && true)
    --> fromCookie
    因此默认情况下jsessionid用cookie传递就可以做到重用,否则就要生成新的jsessionid.
  
    按照这个思路,只要将reuse-session-id配置项设置为"all",就可以做到即使使用url rewrite也可以重用jsessionid.
    ok,问题解决
分享到:
评论
1 楼 liguangyi 2008-10-20  
呵呵,解决了我的一个大问题!

相关推荐

    PyPI 官网下载 | text-reuse-retrieve-0.1.10.tar.gz

    总的来说,text-reuse-retrieve是一个针对文本重复和检索的Python库,对于需要处理大量文本数据并进行相似性分析的项目,它是一个非常有价值的工具。通过深入学习和实践,开发者可以将其应用于各种实际场景,提高...

    reuse-router-seed-master.zip

    "reuse-router-seed-master.zip"这个压缩包提供了一个关于Angular路由复用的代码实例,帮助开发者了解如何在多Tab页面切换时实现路由缓存,从而优化用户界面的性能和用户体验。下面将详细探讨Angular路由复用的概念...

    Knowlton -- Python. Create-Modify-Reuse -- 2008 -- code.7z

    Knowlton -- Python. Create-Modify-Reuse -- 2008 -- code.7z

    tcp-tw-reuse、tcp-tw-recycle 使用场景及注意事项

    tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项

    sfr.rar_ frequency reuse_a-sfr_sfr.rar_sfr功率_soft frequency reus

    而“frequency reuse”、“a-sfr”、“sfr功率”和“soft frequency reuse”则是该主题的关键标签,分别对应了SFR的核心概念、一种特殊的SFR变体、功率分配问题以及SFR的“软”特性。 描述中提到的“matlab仿真”...

    mcu-reuse-development-module: 单片机可复用、可通用开发组件

    单片机可复用、可通用组件(学习为主):mcu_reuse_development_module: 单片机可复用、可通用开发组件,内含:xymodem,bootloader,MODBUS主从机管理(支持RTU和ASCII),内存管理(小内存管理算法),串口管理,消息...

    reuse-of-data-in-the-BE.rar_数据重用_盲均衡_盲均衡技术

    数据重用技术在盲均衡算法中的应用。在军事通信中,小数据包运用比较多,但很多盲均衡算法不能够在小数据包的情况下收敛,所以采用数据重用的技术来克服。

    Adaptive partialfrequency reuse in LTE-Advanced relay networks

    LTE-Advanced(LTE-A)中继网络的自适应部分频谱复用(Adaptive Partial Frequency Reuse, APFR) LTE-Advanced是第四代移动通信技术LTE的演进版本,它在原有技术基础上加入了更多先进的特性以满足未来通信的需求。...

    reuse-previous-network-data:重用以前的网络数据来创建网络

    标题"reuse-previous-network-data:重用以前的网络数据来创建网络"涉及到的关键概念是模型的复用和数据的重复利用,这在训练神经网络时能够显著提高效率并优化性能。这里我们将详细探讨这一主题,尤其是与Go语言相关...

    Knowlton -- Python. Create-Modify-Reuse -- 2008.pdf

    Create-Modify-Reuse -- 2008.pdf”这本书主要介绍了Python编程语言的应用、项目实践以及高级话题等内容。以下是对该书各章节内容进行的详细解读: ### 一、引言 本书旨在通过一系列实际案例,帮助读者深入理解...

    WP2.3-Guideline-documentation-for-reuse-of-OSH-design-

    《OSH设计重用指南文档》是针对开源硬件(Open Source...总之,这份WP2.3-Guideline-documentation-for-reuse-of-OSH-design--main文件将为OSH设计的重用提供一套全面而实用的指导,促进开源硬件领域的持续发展和繁荣。

    reuse-calculator-sample:安卓示例

    【reuse-calculator-sample:安卓示例】是一个专为Android平台设计的应用程序开发示例,它主要展示了如何在移动设备上实现资源的重用,特别是针对计算功能的一种优化设计。这个项目可能对初学者来说有些复杂,因为它...

    【AIX】3004-314 Password was recently used and is not valid for reuse

    ### AIX 3004-314 错误详解与解决办法 ...通过上述步骤和注意事项,可以有效地解决AIX系统中出现的“3004-314 Password was recently used and is not valid for reuse”这一问题,确保系统的稳定运行。

    「安全架构」crauEmu - your IDE for code-reuse attacks - 安全研究.zip

    「安全架构」crauEmu - your IDE for code-reuse attacks - 安全研究 安全漏洞 网络安全 防火墙 渗透测试 安全管理

    Reuse Methodology Manual

    书中的第2章专门讨论了系统级设计问题,包括规则和工具。它提到了标准模型(The Standard Model),软IP(Soft Intellectual Property)和硬IP(Hard Intellectual Property)的区别,以及在重用中全定制设计(Full-...

    react-Reuse通过复用React组件来创建新的组件

    1. **高阶组件(Higher-Order Components, HOCs)**:React-Reuse的一个关键特性是利用高阶组件来实现组件的复用。高阶组件是一个接受一个组件并返回新组件的函数,它可以修改组件的props或实现共享行为。例如,一个...

    labview_Hamburger-Menu-Reuse-

    在本项目“labview_Hamburger-Menu-Reuse-”中,重点是实现一个可重用的汉堡菜单(Hamburger Menu),这是一种常见于移动应用和现代Web设计中的导航元素。汉堡菜单因其图标样式酷似汉堡而得名,通常由三条横线组成,...

    How-to-reuse-a-component-and-configure-its-state-via-a-dictionary

    Blazor-如何重用组件并通过字典配置其状态 在您的应用程序中,您有多个组件。 例如,将其设为DataGrid。 一些网格具有一组设置-其他网格-其他设置: Group 1 &lt; DxDataGrid PageSize = " 5 " ShowFilterRow = ...

    Reuse Localhost Tab-crx插件

    2. **Reuse Localhost Tab的功能**: - **重用标签页**:当用户点击指向localhost或本地服务器的链接时,而不是每次都新开一个标签页,该插件会检查是否已有相同的localhost标签页处于打开状态。如果有,它会将链接...

    Detection-of-Source-Code-Reuse-among-Large-Source-code-collection-Source code collection

    在大型源代码收集2015中检测源代码重用 抽象的 现有的pla窃检测技术基于确定两个源代码之间的语法差异或比较语法树。 所有这些技术都缺乏源代码的优化。 通过循环展开,代码提升,将计算移至某个变量,宏函数和强度...

Global site tag (gtag.js) - Google Analytics