- 浏览: 455804 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (229)
- gef (1)
- emf (0)
- rcp (2)
- 杂谈 (3)
- draw2d (2)
- xml (1)
- spring (16)
- osgi (1)
- jsp (6)
- hibernate (8)
- j2se (41)
- oracle (25)
- js (23)
- ognl (1)
- struts2 (2)
- webwork (1)
- prototype (1)
- dwr (3)
- struts (7)
- axis2 (3)
- axis1 (6)
- lucene (9)
- pop3 (1)
- aspectj (1)
- 网络协议 (6)
- bat (6)
- Quartz (5)
- jms (3)
- jndi (7)
- 网络爬虫 (7)
- acegi (1)
- linux (5)
- 缓存 (1)
- mysql (1)
- 在使用Java处理图形应用时,经常有人推荐设置 -Djava.awt.headless=true,具体含义和效果查了一下,记录在这里分享 Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。 Headless模式虽然不是我们愿意见到的,但事实上我们却常常需要在该模式下工作,尤其是服务器端程序开发者。因为服务器(如提供Web服务的主机)往往可能缺少前述设备,但又需要使用他们提供的功能,生成相应的数据,以提供给客户端(如浏览器所在的配有相关的显示设备、键盘和鼠标的主 (1)
最新评论
-
hanmiao:
注释掉的那壹行少了壹個斜线,楼主...
servlet导出excel -
天下无贼:
Thread.Interrupt方法,只是通过扔出异常的方式, ...
Java Thread.interrupt 害人! 中断JAVA线程(zz) -
天下无贼:
呵呵,是你自己写错了。
Java Thread.interrupt 害人! 中断JAVA线程(zz) -
MO_ZHUANG_D:
如果是真的就感激不尽了
Axure RP教程 -
小嘴冰凉:
在开始执行的时候,如果是数据库存储,程序会从数据库中查job信 ...
quartz的持久化
原创 跨应用程序的session共享 收藏
常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。
然而按照Servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。
首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从 Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。
笔者以前用过的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,各个应用程序仍然只能访问自己所设置的那些属性。
对于这样一种结构,在 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机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析
常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。
然而按照Servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。
首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从 Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。
笔者以前用过的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,各个应用程序仍然只能访问自己所设置的那些属性。
对于这样一种结构,在 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机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析
发表评论
-
java泛型中的上界下界(上限下限) (转)
2013-01-23 18:02 1084java泛型中的super关键字不太常用,也不太好理解,今天又 ... -
Ant中过滤器的使用
2011-12-07 20:06 998Ant中过滤器的使用 <?xml version=&q ... -
将实体声明和实体引用读入 DOM
2011-06-17 17:10 1287实体是一个声明,指定 ... -
多线程编程 实战篇 (四)
2010-12-07 17:48 1025[线程的中断] 不客气地 ... -
Java Thread.interrupt 害人! 中断JAVA线程(zz)
2010-12-07 17:42 3741程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难 ... -
Flex+%2B+LCDS+%2B+Java+入门教程
2010-09-03 16:07 853Flex+LCDS+Java+入门教程 -
Flex完全自学入门手册
2010-09-03 13:08 887http://lichen.blog.51cto.com/69 ... -
java 5 多线程sun教程
2010-05-21 10:43 1180http://gceclub.sun.com.cn/Concu ... -
ibm的nio教程
2010-04-12 18:13 1145ibm的nio教程 -
cas单点登陆
2009-12-17 17:05 834http://blog.csdn.net/DL88250/ar ... -
CAS项目实践
2009-12-17 16:40 1140目的:使用单点登录系 ... -
Tomcat SSL配置大全
2009-12-17 16:13 1129由于配置CAS的单点登陆系统,需要先配置Tomcat的SSL, ... -
Thread.getContextClassLoader() 详解
2009-12-17 12:24 1200答 : 这个问题经常出现在编写框架代码 , 需要动态加载很多类 ... -
Session知识共享
2009-12-09 17:02 954摘要:虽然session机制在 ... -
HTTP代理如何正确处理Cookie
2009-12-09 14:15 1540大多数的 Web 应用程序 ... -
使用HttpURLConnection类(利用sessionId保持会话
2009-12-09 11:19 5552TestServlet.java package n ... -
使用HttpURLConnection获得重定向地址
2009-12-09 09:37 1792今天跟TiGERTiAN谈到HttpURLConnec ... -
java多线程之 wait(),notify(),notifyAll()
2009-12-01 11:38 944java多线程之 wait(),notify(),notify ... -
Callable 和 Future
2009-12-01 11:28 1705天在书上看到callable和future这个两个东东,以前没 ... -
重载和覆盖
2009-11-17 10:02 869override可以翻译为覆盖,从字面就可以知道,它是覆盖了一 ...
相关推荐
跨应用程序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共享`成为了多台...