- 浏览: 447708 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1052java泛型中的super关键字不太常用,也不太好理解,今天又 ... -
Ant中过滤器的使用
2011-12-07 20:06 946Ant中过滤器的使用 <?xml version=&q ... -
将实体声明和实体引用读入 DOM
2011-06-17 17:10 1252实体是一个声明,指定 ... -
多线程编程 实战篇 (四)
2010-12-07 17:48 983[线程的中断] 不客气地 ... -
Java Thread.interrupt 害人! 中断JAVA线程(zz)
2010-12-07 17:42 3701程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难 ... -
Flex+%2B+LCDS+%2B+Java+入门教程
2010-09-03 16:07 805Flex+LCDS+Java+入门教程 -
Flex完全自学入门手册
2010-09-03 13:08 855http://lichen.blog.51cto.com/69 ... -
java 5 多线程sun教程
2010-05-21 10:43 1121http://gceclub.sun.com.cn/Concu ... -
ibm的nio教程
2010-04-12 18:13 1110ibm的nio教程 -
cas单点登陆
2009-12-17 17:05 798http://blog.csdn.net/DL88250/ar ... -
CAS项目实践
2009-12-17 16:40 1097目的:使用单点登录系 ... -
Tomcat SSL配置大全
2009-12-17 16:13 1096由于配置CAS的单点登陆系统,需要先配置Tomcat的SSL, ... -
Thread.getContextClassLoader() 详解
2009-12-17 12:24 1134答 : 这个问题经常出现在编写框架代码 , 需要动态加载很多类 ... -
Session知识共享
2009-12-09 17:02 922摘要:虽然session机制在 ... -
HTTP代理如何正确处理Cookie
2009-12-09 14:15 1502大多数的 Web 应用程序 ... -
使用HttpURLConnection类(利用sessionId保持会话
2009-12-09 11:19 5518TestServlet.java package n ... -
使用HttpURLConnection获得重定向地址
2009-12-09 09:37 1761今天跟TiGERTiAN谈到HttpURLConnec ... -
java多线程之 wait(),notify(),notifyAll()
2009-12-01 11:38 913java多线程之 wait(),notify(),notify ... -
Callable 和 Future
2009-12-01 11:28 1666天在书上看到callable和future这个两个东东,以前没 ... -
重载和覆盖
2009-11-17 10:02 837override可以翻译为覆盖,从字面就可以知道,它是覆盖了一 ...
相关推荐
asp.net 应用程序,通过web.config 应用程序发布到IIS上,实现不同应用程序之间session 共享
2、问题原因: 一个WEB应用相当于一个站点,应用与应用之间不可能共享Session。3、解决方法:1) 将四个web应用包含在同一个解决方案中(注:调整.webinfo文件使解决方案能构正常运行)2) 新建一个web应用Main,...
目录: 一、术语session 二、HTTP协议与状态保持 三、理解cookie机制 四、理解session机制 五、理解javax.servlet.http.HttpSession ...六、HttpSession常见问题 ...七、跨应用程序的session共享 八、总结
javascriptSession用户session共享页面数据,适合于单页面应用程序开发
sna集中式session管理实现服务器集群及客户端程序,以“单点登陆、session共享解决方案(2)”为基础建立的服务器机群应用,运行server.bat启动服务器端,将client包导入web工程,通过Client.sessionPut()等方法调用。...
在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据。而且Application对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。 Session即会话,是指一个用户在一...
一个中间件,用于共享来自Koa应用程序的会话。 通过以下方式获取koa应用会话: let mySession = socket.session; 要求 Koa2 节点7.6或更高版本支持异步/等待 支持的Koa会话中间件 安装 npm install koa-socketio-...
Application:记录应用程序参数的对象,该对象用于共享应用程序级信息。 Session:记录浏览器端的变量对象,用来存储跨网页程序程序的变量或者对象。 说实话,写了快一年的asp.net,application对象还真没怎么用过...
application对象代表应用程序上下文,它允许JSP页面与包括在同一应用程序中的任何Web组件共享信息。 Out对象代表提供输出流的访问 Page对象代表JSP页面对应的Servlet类实例 Request对象提供对Http请求数据的访问,...
在域模式下为Wildfly分发的示例应用程序。 该应用程序允许您测试会话变量和Hibernate的二级缓存。 为此,我们将使用maven生成war软件包以上载到应用程序服务器。 生成.war文件 首先,使用GIT下载存储库。 git ...
前三个包含用于演示的应用程序的源代码。 怎么跑 每个应用都需要使用./gradlew build命令手动./gradlew build 第一部分(静态仪器) ./App/script1.sh decompile -显示SamplePrinter类的字节码 ./App/script1.sh run...
通过插入以下行来配置全局上下文(CATALINA.HOME / conf / context.xml)或Web应用程序上下文(META-INF / context.xml),以使用Tomcat Redis Session Manager “ ru.zinin.redis.session.RedisManager ” /> ...
在一个基于ASP.NET的Web应用程序中,我们通常使用SessionState保存基于某个客户端的状态信息。但是这种单纯使用SessionState的编程方式具有很多局限,比如SessionItem的Key值冲突,比如没有一个有效的SessionState...
时间线 我将在此处与JSP和Java Servlets JDBC和MySQL Session以及Cookie HTML5,JavaScript和CSS共享时间线应用程序
当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,因此在用ASP开发网络应用程序时,可以利用Session对象保存和跟踪用户的状态信息。 Session对象有一个十分重要的属性...
在Web应用程序中,当一个用户访问该应用时,Session类型的变量可以供这个用户在该Web应用的所有页面中共享数据;如果另一个用户也同时访问该Web应用,他也拥有自己的Session变量,但两个用户之间无法通过Session变量...
APPLICATION对象:这个对象用来处理所有应用程序共享的WEB应用程序。WEB应用程序是一个脚本和WEB页面的集合。 SESSION对象:这个对象用来存储一个特定用户会话所需要的用户信息。在SESSION对象之中存储变量信息在...
5.2 global.asax应用程序文件 5.2.1 应用程序事件 5.2.2 演示应用程序事件 5.3 ASP.NET配置 5.3.1 machine.config文件 5.3.2 web.config文件 5.3.3 设置 5.3.4 5.3.5 5.3.6 5.3.7 通过编程读写...
10.2.2 搭建简单的离线应用程序 203 10.2.3 支持离线行为 204 10.2.4 manifest文件 204 10.2.5 applicationcache api 205 10.3 使用html5离线web应用构建应用 206 10.3.1 创建记录资源的manifest文件 208 ...