上文中详细描述了问题的表现情况,由于这个特性严重影响到目前为公司设计的一套前台统一认证方案,因此不得不特别关注。好在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,问题解决
分享到:
相关推荐
总的来说,text-reuse-retrieve是一个针对文本重复和检索的Python库,对于需要处理大量文本数据并进行相似性分析的项目,它是一个非常有价值的工具。通过深入学习和实践,开发者可以将其应用于各种实际场景,提高...
"reuse-router-seed-master.zip"这个压缩包提供了一个关于Angular路由复用的代码实例,帮助开发者了解如何在多Tab页面切换时实现路由缓存,从而优化用户界面的性能和用户体验。下面将详细探讨Angular路由复用的概念...
Knowlton -- Python. Create-Modify-Reuse -- 2008 -- code.7z
tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项
而“frequency reuse”、“a-sfr”、“sfr功率”和“soft frequency reuse”则是该主题的关键标签,分别对应了SFR的核心概念、一种特殊的SFR变体、功率分配问题以及SFR的“软”特性。 描述中提到的“matlab仿真”...
单片机可复用、可通用组件(学习为主):mcu_reuse_development_module: 单片机可复用、可通用开发组件,内含:xymodem,bootloader,MODBUS主从机管理(支持RTU和ASCII),内存管理(小内存管理算法),串口管理,消息...
数据重用技术在盲均衡算法中的应用。在军事通信中,小数据包运用比较多,但很多盲均衡算法不能够在小数据包的情况下收敛,所以采用数据重用的技术来克服。
LTE-Advanced(LTE-A)中继网络的自适应部分频谱复用(Adaptive Partial Frequency Reuse, APFR) LTE-Advanced是第四代移动通信技术LTE的演进版本,它在原有技术基础上加入了更多先进的特性以满足未来通信的需求。...
标题"reuse-previous-network-data:重用以前的网络数据来创建网络"涉及到的关键概念是模型的复用和数据的重复利用,这在训练神经网络时能够显著提高效率并优化性能。这里我们将详细探讨这一主题,尤其是与Go语言相关...
Create-Modify-Reuse -- 2008.pdf”这本书主要介绍了Python编程语言的应用、项目实践以及高级话题等内容。以下是对该书各章节内容进行的详细解读: ### 一、引言 本书旨在通过一系列实际案例,帮助读者深入理解...
《OSH设计重用指南文档》是针对开源硬件(Open Source...总之,这份WP2.3-Guideline-documentation-for-reuse-of-OSH-design--main文件将为OSH设计的重用提供一套全面而实用的指导,促进开源硬件领域的持续发展和繁荣。
【reuse-calculator-sample:安卓示例】是一个专为Android平台设计的应用程序开发示例,它主要展示了如何在移动设备上实现资源的重用,特别是针对计算功能的一种优化设计。这个项目可能对初学者来说有些复杂,因为它...
### AIX 3004-314 错误详解与解决办法 ...通过上述步骤和注意事项,可以有效地解决AIX系统中出现的“3004-314 Password was recently used and is not valid for reuse”这一问题,确保系统的稳定运行。
「安全架构」crauEmu - your IDE for code-reuse attacks - 安全研究 安全漏洞 网络安全 防火墙 渗透测试 安全管理
书中的第2章专门讨论了系统级设计问题,包括规则和工具。它提到了标准模型(The Standard Model),软IP(Soft Intellectual Property)和硬IP(Hard Intellectual Property)的区别,以及在重用中全定制设计(Full-...
1. **高阶组件(Higher-Order Components, HOCs)**:React-Reuse的一个关键特性是利用高阶组件来实现组件的复用。高阶组件是一个接受一个组件并返回新组件的函数,它可以修改组件的props或实现共享行为。例如,一个...
在本项目“labview_Hamburger-Menu-Reuse-”中,重点是实现一个可重用的汉堡菜单(Hamburger Menu),这是一种常见于移动应用和现代Web设计中的导航元素。汉堡菜单因其图标样式酷似汉堡而得名,通常由三条横线组成,...
Blazor-如何重用组件并通过字典配置其状态 在您的应用程序中,您有多个组件。 例如,将其设为DataGrid。 一些网格具有一组设置-其他网格-其他设置: Group 1 < DxDataGrid PageSize = " 5 " ShowFilterRow = ...
2. **Reuse Localhost Tab的功能**: - **重用标签页**:当用户点击指向localhost或本地服务器的链接时,而不是每次都新开一个标签页,该插件会检查是否已有相同的localhost标签页处于打开状态。如果有,它会将链接...
在大型源代码收集2015中检测源代码重用 抽象的 现有的pla窃检测技术基于确定两个源代码之间的语法差异或比较语法树。 所有这些技术都缺乏源代码的优化。 通过循环展开,代码提升,将计算移至某个变量,宏函数和强度...