常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。
然而按照Servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。
首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。
根据这个特性,我们可以推测Tomcat中session的内存结构大致如下。
笔者以前用过的iPlanet也采用的是同样的方式,估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器,解决的思路很简单,实际实行起来也不难。要么让所有的应用程序共享一个session id,要么让应用程序能够获得其他应用程序的session id。
iPlanet中有一种很简单的方法来实现共享一个session id,那就是把各个应用程序的cookie路径都设为/(实际上应该是/NASApp,对于应用程序来讲它的作用相当于根)。
<session-info>
<path>/NASApp</path>
</session-info>
需要注意的是,操作共享的session应该遵循一些编程约定,比如在session attribute名字的前面加上应用程序的前缀,使得setAttribute("name", "neo")变成setAttribute("app1.name", "neo"),以防止命名空间冲突,导致互相覆盖。
在Tomcat中则没有这么方便的选择。在Tomcat版本3上,我们还可以有一些手段来共享session。对于版本4以上的Tomcat,目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段。
我们再看一下Weblogic Server是如何处理session的。
从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/,这是不是意味着在Weblogic Server中默认的就可以共享session了呢?然而一个小实验即可证明即使不同的应用程序使用的是同一个session,各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下:
对于这样一种结构,在session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段,还有一种较为方便的做法,就是把一个应用程序的session放到ServletContext中,这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,
应用程序A :
context.setAttribute("appA", session);
应用程序B :
contextA = context.getContext("/appA");
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");
值得注意的是这种用法不可移植,因为根据ServletContext的JavaDoc,应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通过。
那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢?原来是为了SSO,凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点,修改首先登录的那个应用程序的描述符weblogic.xml,把cookie路径修改为/appA访问另外一个应用程序会重新要求登录,即使是反过来,先访问cookie路径为/的应用程序,再访问修改过路径的这个,虽然不再提示登录,但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM,因为浏览器和web服务器对basic认证方式有其他的处理方式,第二次请求的认证不是通过session来实现的。具体请参看[7] secion 14.8 Authorization,你可以修改所附的示例程序来做这些试验。
分享到:
相关推荐
跨应用程序Session共享可能不是最佳实践,因为它增加了复杂性并可能导致安全问题。考虑使用其他持久化机制,如Cookie(对于小量数据)、数据库(对于大量数据)或自定义的分布式缓存(如Redis)。 总结来说,实现...
ASP.NET中的Session是Web应用程序用来在用户会话之间存储数据的一种机制。然而,当涉及到多个子域时,标准的Session机制并不支持数据的共享。在跨子域网站间共享Session,是为了提供统一的用户体验,例如在电子商务...
本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 在实现 session 共享之前,需要在项目中引入相关依赖项,包括: * ...
在.NET开发环境中,C#是一种常用的编程语言,用于构建各种Web应用程序。在处理用户交互时,Session是一个重要的概念,它允许开发者在用户的不同请求之间存储数据。然而,当涉及到跨域(即不同域名)的Session共享时...
3. 在应用程序中使用Spring Session代替传统的HTTPSession。 4. 使用Nginx或其他反向代理服务器来管理多个实例,并将请求分发到不同的实例上。 结论 Springboot实现多服务器session共享可以解决分布式系统中...
在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便提高应用程序的可扩展性和可用性。标题和描述提到的“session共享包”是解决这一问题的关键。 **什么是Session?** 在Web应用中,Session是...
本文将深入探讨session的工作原理,以及如何在Java Web应用程序中有效地应用session,同时还会涉及跨服务器的session共享。 一、术语session session这个词在不同的上下文中有着不同的含义。在最基本的层面上,...
1. **SpringMvc**:SpringMvc是Spring框架的一部分,作为一个轻量级的MVC(Model-View-Controller)框架,它简化了Web应用程序的开发。SpringMvc通过DispatcherServlet处理HTTP请求,使用ModelAndView对象来封装数据...
Session是Web应用程序中用于跟踪用户状态的一种机制,它存储在服务器端,与传统的基于cookie的客户端存储方式相比,更安全且能存储大量数据。然而,当一个网站部署在多台服务器上时,单个服务器上的session无法在...
具体到压缩包内的文件“npp.6.1.Installer.exe”,这看起来是一个Notepad++的安装程序,可能不是与Session共享相关的文件,但可能是开发者用来编辑配置文件的工具。另一个文件“tomcat7-redis-session”可能是专门为...
这个小例子"nginx+tomcat+redis完成session共享"旨在演示如何通过这三种技术实现跨服务器的用户会话共享,以提升用户体验并简化系统管理。以下是这些技术及其在会话共享中的作用: 1. **Nginx**:Nginx是一款高性能...
Session 是一种保存用户状态的机制,允许 Web 应用程序存储和访问用户的状态信息。然而,在 J2EE 同域中,跨项目 Session 共享是一个很大的挑战。为什么我们需要跨项目 Session 共享?因为在同一个域中,多个项目...
总的来说,通过序列化和反序列化机制实现的跨站点Session共享和单点登录是一种实用的解决方案,尤其适用于那些已有多个网站并且希望实现统一用户管理的ASP.NET 2.0应用程序。但同时,为了确保系统的稳定性和安全性,...
Spring是一个全面的后端应用程序框架,它提供依赖注入(DI)和面向切面编程(AOP)等功能。Spring MVC是Spring框架的一部分,专门处理Web请求,而MyBatis是一个轻量级的持久层框架,简化了数据库操作。 在分布式...
Redis是一种高性能的键值数据库,常被用于存储和检索数据,包括Web应用程序中的会话(Session)管理。在Java Web开发中,为了实现跨服务器的Session共享,开发者常常选择将用户的Session信息存储在Redis这样的分布式...
【session共享插件】是一种用于Java应用程序的解决方案,旨在实现跨服务器的会话状态共享。在Web应用中,session是服务器用来存储用户特定信息的一种机制,例如登录状态、购物车内容等。当应用部署在多台服务器上时...
【描述】中提到的“实现session共享”是指在Web应用程序运行于多个服务器实例(例如,负载均衡环境)时,通过将session数据保存在外部存储(在这种情况下是Redis内存数据库)中,确保所有服务器可以访问同一份...
在IT行业中,Tomcat是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用程序规范。在部署高可用性、高并发性的应用时,通常会构建Tomcat集群来提高服务的可扩展性和容错性。然而,当涉及到用户状态管理...
在构建分布式Web应用程序时,集群部署是常见的策略,它可以提高系统的可用性和可扩展性。然而,随着集群的建立,一个问题也随之出现:如何在不同的服务器之间共享用户会话(session)。`session共享`成为了多台...