??xml version="1.0" encoding="utf-8" standalone="yes"?>性色av一区,麻豆精品视频在线观看,久久久9色精品国产一区二区三区http://www.aygfsteel.com/alex-0927/zh-cnWed, 18 Jun 2025 11:35:49 GMTWed, 18 Jun 2025 11:35:49 GMT60跨应用Session׃n(转蝲)http://www.aygfsteel.com/alex-0927/archive/2007/04/26/113774.htmlalex-0927alex-0927Thu, 26 Apr 2007 06:38:00 GMThttp://www.aygfsteel.com/alex-0927/archive/2007/04/26/113774.html跨应用Session׃n

       摘要Q虽然session机制在web应用E序中被采用已经很长?wbr>间了(jin)Q但是仍然有很多Z清楚session机制的本?wbr>Q以至不能正的应用q一技术。本文将详细讨论session的工作机制ƈ且对在Java web application中应用session机制时常见的问题作出解答?/wbr>

一、术语session
在我的经验里Qsessionq个词被滥用的程度大概仅ơ于transactionQ更加有的是transaction与session在某些语境下的含义是相同的?/wbr>

sessionQ中文经常翻译ؓ(f)?x)?/strong>Q其本来的含义是指有始有l的一pd动作/消息Q比如打?sh)话时从?wbr>L(fng)(sh)话拨号到挂断?sh)话q中间的一pdq程可以UCZ个session。有时候我们可以看到这L(fng)?在一个浏览器?x)话期间Q?.."Q这里的?x)话一词用的就是其本义Q是指从一个浏览器H口打开?wbr>关闭q个期间①。最混ؕ的是"用户Q客L(fng)Q在一ơ会(x)话期?wbr>"q样一句话Q它可能指用L(fng)一pd动作Q一般情况下是同某个具体目的相关的一pd动作Q比如从d到选购商品到结账登?gu)样一个网上购物的q程Q有时候也被称Z个transactionQ?wbr>Q然而有时候也可能仅仅是指一ơ连接,也有可能是指含义?wbr>Q其中的差别只能靠上下文来推断②?

然而当session一词与|络协议相关联时Q它又往往隐含?wbr>"面向q接"??保持状?q样两个含义Q?面向q接"指的是在通信双方在通信之前要先建立一个通信的渠?wbr>Q比如打?sh)话Q直到对Ҏ(gu)?jin)?sh)话通信才能开始,与此相对的是写信Q在你把信发出去的时候你q不能确认对方的地址是否正确Q通信渠道不一定能建立Q但对发信h来说Q通信已经开始了(jin)?wbr>"保持状?则是指通信的一方能够把一pd的消息关联v?wbr>Q得消息之间可以互怾赖,比如一个服务员能够认出再次光(f)的?wbr>֮q且记得上次q个֮q欠店里一块钱。这一cȝ例子?wbr>"一个TCP session"或?一个POP3 session"③?

而到?jin)web服务器蓬勃发展的时代Qsession在web开发语境下的语义又有了(jin)新的扩展Q它的含义是指一cȝ来在客户端与服务?wbr>之间保持状态的解决Ҏ(gu)④。有时候session也用来指q种解决Ҏ(gu)的存储结构,?把xxx保存在session??wbr>。由于各U用于web开发的语言在一定程度上都提供了(jin)对这U解x案的支持Q所以在某种特定语言的语境下Qsession也被用来?wbr>代该语言的解x案,比如l常把Java里提供的javax.servlet.http.HttpSessionUCؓ(f)session⑥?

鉴于q种混ؕ已不可改变,本文中session一词的q用也会(x)Ҏ(gu)上下文有不同的含义,请大家注意分辨?br />在本文中Q用中?览器会(x)话期?来表辑֐义①Q?wbr>"session机制"来表辑֐义④Q?session"表达含义⑤,使用具体?HttpSession"来表辑֐义⑥

二、HTTP协议与状态保?/strong>
       HTTP协议本n是无状态的Q这与HTTP协议本来的目的是相符?wbr>Q客L(fng)只需要简单的向服务器h下蝲某些文gQ无论是客户端还?wbr>服务器都没有必要U录彼此q去的行为,每一ơ请求之间都是独立的Q好比一个顾客和一个自动售货机或者一个普通的Q非?x)员?wbr>Q大卖场之间的关pM栗?/wbr>

然而聪明(或者贪?j)?Q的Z很快发现如果能够提供一些按需生成?wbr>动态信息会(x)使web变得更加有用Q就像给有线?sh)视加上?gu)功能一?wbr>。这U需求一斚wqHTML逐步d?jin)表单、脚?wbr>、DOM{客L(fng)行ؓ(f)Q另一斚w在服务器端则出现?jin)CGI规范以响应客L(fng)的动态请求,作ؓ(f)传输载体的HTTP协议也添加了(jin)文g上蝲、cookieq些Ҏ(gu)。其中cookie的作用就是ؓ(f)?jin)解决HTTP协议无状态的~陷所作出的努力。至于后来出现的session机制则是又一U在客户端与服务器之间保持状态的解决Ҏ(gu)?

让我们用几个例子来描qC下cookie和session机制之间的区别与联系。笔者曾l常ȝ一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠Q然而一ơ性消?杯咖啡的Z(x)微乎其微Q这时就需要某U方式来U录某位֮的消Ҏ(gu)量。想象一下其实也?wbr>外乎下面的几U方案:(x)
1、该店的店员很厉宻I能记住每位顾客的消费数量Q只要顾客一走进咖啡店,店员q道该怎么对待?wbr>。这U做法就是协议本w支持状态?br />2、发l顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每ơ消Ҏ(gu)Q如果顾客出C张卡片,则此ơ消费就?x)与以前或以?wbr>的消费相联系h。这U做法就是在客户端保持状态?
3、发l顾客一张会(x)员卡Q除?jin)卡号之外什么信息也不纪?wbr>Q每ơ消Ҏ(gu)Q如果顾客出C卡片Q则店员在店里的U录本上扑ֈq?wbr>个卡号对应的U录d一些消费信息。这U做法就是在服务器端保持?wbr>态?/wbr>

׃HTTP协议是无状态的Q而出于种U考虑也不希望使之成ؓ(f)有状态的Q因此,后面两种Ҏ(gu)成为现实的选择。具体来说cookie机制采用的是在客L(fng)保持状态的Ҏ(gu)Q而session机制采用?wbr>是在服务器端保持状态的Ҏ(gu)。同时我们也看到Q由于采用服务器端保持状态的Ҏ(gu)在客L(fng)也需要保存一个标识,所以session机制可能需要借助于cookie机制来达C存标识的目的Q但实际上它q有其他选择?/wbr>

三、理解cookie机制
cookie机制的基本原理就如上面的例子一L(fng)?wbr>Q但是还有几个问题需要解冻I(x)"?x)员?如何分发Q??x)员?wbr>"的内容;以及(qing)客户如何使用"?x)员??/wbr>

正统的cookie分发是通过扩展HTTP协议来实现的Q服务器通过在HTTP的响应头中加上一行特D的指示以提C浏览器按照指示生成相应的cookie。然而纯_的客户端脚本如JavaScript或者VBScript也可以生成cookie?/wbr>

而cookie的用是由浏览器按照一定的原则在后台自动发送给?wbr>务器的。浏览器(g)查所有存储的cookieQ如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置Q则把该cookie附在h资源的HTTPh头上发送给服务?wbr>。意思是麦当劳的?x)员卡只能在麦当劳的店里出示Q如果某家分店还?wbr>行了(jin)自己的会(x)员卡Q那么进q家店的时候除?jin)要出示麦当劳的会(x)员?wbr>Q还要出C家店的会(x)员卡?/wbr>

cookie的内容主要包括:(x)名字Q|q期旉Q\径和域?br />其中域可以指定某一个域比如.google.comQ相当于d招牌Q比如宝z公司,也可以指定一个域下的具体某台机器比如www.google.com或者f(xi)roogle.google.comQ可以用飘柔来做比?br />路径是跟在域名后面的URL路径Q比?或?foo{等Q可以用某飘柔专柜做比?br />路径与域合在一起就构成?jin)cookie的作用范围?
如果不设|过期时_(d)则表C个cookie的生命期为浏览器?x)?wbr>期间Q只要关闭浏览器H口Qcookie消׃(jin)。这U生命期为浏览器?x)话期的cookie被称Z(x)话cookie。会(x)话cookie一般不存储在硬盘上而是保存在内存里Q当然这U行为ƈ不是规范规定的。如果设|了(jin)q期旉Q浏览器׃(x)把cookie保存到硬盘上Q关闭后再次打开览?wbr>Q这些cookie仍然有效直到过讑֮的过期时间?/wbr>

存储在硬盘上的cookie可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方式。对于IEQ在一个打开的窗口上?wbr>Ctrl-NQ或者从文g菜单Q打开的窗口可以与原窗口共?wbr>Q而用其他方式新开的IEq程则不能共享已l打开的窗口的内存cookieQ对于Mozilla Firefox0.8Q所有的q程和标{N都可以共享同L(fng)cookie。一般来说是用javascript的window.open打开的窗口会(x)与原H口׃n内存cookie 。浏览器对于?x)话cookie的这U只认cookie不认人的处理方式l常l采用session机制的web应用E序开发者造成很大的困扰?/wbr>

下面是一个goolge讄cookie的响应头的例?br />HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html


q是使用HTTPLookq个HTTP Sniffer软g来俘L(fng)HTTP通讯U录的一部分


览器在再次讉Kgoolge的资源时自动向外发送cookie


使用Firefox可以很容易的观察现有的cookie的?br />使用HTTPLook配合F(tun)irefox可以很容易的理解cookie的工作原理?/wbr>


IE也可以设|在接受cookie前询?/font>


q是一个询问接受cookie的对话框?/font>

四、理解session机制
session机制是一U服务器端的机制Q服务器使用一U类g?wbr>列表的结构(也可能就是用散列表Q来保存信息?/wbr>

当程序需要ؓ(f)某个客户端的h创徏一个session的时?wbr>Q服务器首先(g)查这个客L(fng)的请求里是否已包含了(jin)一个session标识 - UCؓ(f)session idQ如果已包含一个session id则说明以前已lؓ(f)此客L(fng)创徏qsessionQ服务器按照session id把这个session(g)索出来用(如果(g)索不?wbr>Q可能会(x)新徏一个)(j)Q如果客L(fng)h不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会(x)重复Q又不容易被扑ֈ规律以仿造的字符?wbr>Q这个session id被在本ơ响应中q回l客L(fng)保存?

保存q个session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类gSEEESIONIDQ而。比如weblogic对于web应用E序生成的cookieQJSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就是JSESSIONID?

׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓ(f)URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一U是作ؓ(f)查询字符串附加在URL后面Q表现Ş式ؓ(f)http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
q两U方式对于用h说是没有区别的,只是服务器在解析的时候处?wbr>的方式不同,采用W一U方式也有利于把session id的信息和正常E序参数区分开来?br />Z(jin)在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session id?

另一U技术叫做表单隐藏字Dc(din)就是服务器?x)自动修改表?wbr>Q添加一个隐藏字D,以便在表单提交时能够把session id传递回服务器。比如下面的表单
<form name="testform" action="/xxx">
<input type="text">
</form>
在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了(jin)q种技术?br />实际上这U技术可以简单的用对action应用URL重写来代ѝ?/wbr>

在谈论session机制的时候,常常听到q样一U误?wbr>"只要关闭览器,session消׃(jin)"。其实可以想象一下会(x)员卡的例子,除非֮d对店家提出销卡,否则店家l对不会(x)L?wbr>除顾客的资料。对session来说也是一L(fng)Q除非程序通知服务器删除一个sessionQ否则服务器?x)一直保?wbr>Q程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会(x)?wbr>动在关闭之前通知服务器它?yu)要关闭Q因此服务器Ҏ(gu)不会(x)有机?x)知?wbr>览器已l关闭,之所以会(x)有这U错觉,是大部分session机制都用会(x)话cookie来保存session idQ而关闭浏览器后这个session id消׃(jin)Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘上,或者用某U手D?wbr>改写览器发出的HTTPh_(d)把原来的session id发送给服务器,则再ơ打开览器仍然能够找到原来的session?

恰恰是由于关闭浏览器不会(x)Dsession被删?wbr>Q迫使服务器为seesion讄?jin)一个失效时?wbr>Q当距离客户端上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L(fng)已经停止?jin)活动,才?x)把session?wbr>除以节省存储I间?/wbr>

五、理解javax.servlet.http.HttpSession
HttpSession是Javaq_对session机制的实?wbr>规范Q因为它仅仅是个接口Q具体到每个web应用服务器的提供?wbr>Q除?jin)对规范支持之外Q仍然会(x)有一些规范里没有规定的细微差?wbr>。这里我们以BEA的Weblogic Server8.1作ؓ(f)例子来演C?/wbr>

首先QW(xu)eblogic Server提供?jin)一pd的参数来控制它的HttpSession的实玎ͼ包括使用cookie的开关选项Q用URL重写的开关?wbr>,session持久化的讄Qsession失效旉的设|?wbr>Q以?qing)针对cookie的各U设|,比如讄cookie的名?wbr>、\径、域Qcookie的生存时间等?/wbr>

一般情况下Qsession都是存储在内存里Q当服务器进E被停止或者重启的时候,内存里的session也会(x)被清I?wbr>Q如果设|了(jin)session的持久化Ҏ(gu),服务器就?x)把session保存到硬盘上Q当服务器进E重新启动或q些信息能够被再次?wbr>用,W(xu)eblogic Server支持的持久性方式包括文件、数据库、客L(fng)cookie保存和复制?/wbr>

复制严格说来不算持久化保存,因ؓ(f)session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进E?wbr>中,q样即某个服务器进E停止工作也仍然可以从其他进E中取得session?/wbr>

cookie生存旉的设|则?x)?jing)响浏览器生成的cookie是否是一个会(x)话cookie。默认是使用?x)话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解?/wbr>

cookie的\径对于web应用E序来说是一个非帔R要的选项QW(xu)eblogic Server对这个选项的默认处理方式得它与其他服务器有明昄区别。后面我们会(x)专题讨论?/wbr>

关于session的设|参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

六、HttpSession常见问题
Q在本小节中session的含义ؓ(f)⑤和⑥的混合Q?/font>


1、session在何时被创徏
一个常见的误解是以为session在有客户端访问时p创徏Q然而事实是直到某server端程序调用HttpServletRequest.getSession(true)q样的语句时才被创徏Q注意如果JSP没有昄的?<%@page session="false"%> 关闭sessionQ则JSP文g在编译成Servlet时将?x)?wbr>动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);q也是JSP中隐含的session对象的来历?/wbr>

׃session?x)消耗内存资源,因此Q如果不打算使用sessionQ应该在所有的JSP中关闭它?/wbr>

2、session何时被删?br />l合前面的讨论,session在下列情况下被删除a.E序调用HttpSession.invalidate();或b.距离上一ơ收到客L(fng)发送的session id旉间隔过?jin)session的超时设|?或c.服务器进E被停止Q非持久sessionQ?/wbr>

3、如何做到在览器关闭时删除session
严格的讲Q做不到q一炏V可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器?wbr>溃或者强行杀死进E这些非常规手段仍然无能为力?/wbr>

4、有个HttpSessionListener是怎么回事
你可以创L(fng)listenerȝ控session的创建和销毁事Ӟ使得在发生这L(fng)事g时你可以做一些相应的工作。注意是session的创建和销毁动作触发listenerQ而不是相反。类似的与HttpSession有关的listenerq有HttpSessionBindingListenerQHttpSessionActivationListener?wbr>HttpSessionAttributeListener?

5、存攑֜session中的对象必须是可序列化的?br />不是必需的。要求对象可序列化只是ؓ(f)?jin)session能够在集中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在Weblogic Server的session中放|一个不可序列化的对象在控制?wbr>上会(x)收到一个警告。我所用过的某个iPlanet版本如果session中有不可序列化的对象Q在session销毁时?x)有一个ExceptionQ很奇怪?

6、如何才能正的应付客户端禁止cookie的可能?br />Ҏ(gu)有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URLQ具体做法参见[6]
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

7、开两个览器窗口访问应用程序会(x)使用同一个sessionq是不同的session
参见W三节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器Q不同的H口打开方式以及(qing)不同的cookie存储方式都会(x)对这个问题的{案有媄(jing)响?/wbr>

8、如何防止用h开两个览器窗口操作导致的session混ؕ
q个问题与防止表单多ơ提交是cM的,可以通过讄客户端的令牌?wbr>解决。就是在服务器每ơ生成一个不同的idq回l客L(fng)Q同时保存在session里,客户端提交表单时必须把这个id?wbr>q回服务器,E序首先比较q回的id与保存在session里的?wbr>是否一_(d)如果不一致则说明本次操作已经被提交过?jin)。可以参?wbr>《J2EE核心(j)模式》关于表C层模式的部分。需要注意的是对于?wbr>javascript window.open打开的窗口,一般不讄q个idQ或者用单独的idQ以防主H口无法操作Q徏议不要再window.open打开的窗口里做修Ҏ(gu)作,q样可以不用设|?/wbr>

9、ؓ(f)什么在Weblogic Server中改变session的值后要重新调用一ơsession.setValue
做这个动作主要是Z(jin)在集环境中提示Weblogic Server session中的值发生了(jin)改变Q需要向其他服务器进E复制新的session倹{?/wbr>

10、ؓ(f)什么session不见?br />排除session正常失效的因素之外,服务器本w的可能性应该是微乎其微的,虽然W者在iPlanet6SP1加若q补丁的Solaris版本上倒也遇到q;览器插件的可能性次?wbr>Q笔者也遇到q?721插g造成的问题;理论上防火墙或者代理服?wbr>器在cookie处理上也有可能会(x)出现问题?br />出现q一问题的大部分原因都是E序的错误,最常见的就是在一个应?wbr>E序中去讉K另外一个应用程序。我们在下一节讨个问题?

七、跨应用E序的session׃n

常常有这L(fng)情况Q一个大目被分割成若干项目开?wbr>Qؓ(f)?jin)能够互不干扎ͼ要求每个项目作Z个单独的web应用E序开发,可是C(jin)最后突然发现某几个项目之间需要共享一些信?wbr>Q或者想使用session来实现SSO(single sign on)Q在session中保存login的用户信?wbr>Q最自然的要求是应用E序间能够访问彼此的session?

然而按照Servlet规范Qsession的作用范围应该仅仅限于当前应用程序下Q不同的应用E序之间是不能够互相讉KҎ(gu)的session的。各个应用服务器从实际效果上都遵守了(jin)q一规范Q但是实现的l节却可能各有不同,因此解决跨应用程序session׃n的方法也各不相同?/wbr>

首先来看一下Tomcat是如何实现web应用E序之间session的隔ȝQ从Tomcat讄的cookie路径来看Q它对不同的应用E序讄的cookie路径是不同的Q这样不同的应用E序所用的session id是不同的Q因此即使在同一个浏览器H口里访问不同的应用E序Q发送给服务器的session id也可以是不同的?br />

Ҏ(gu)q个Ҏ(gu),我们可以推测Tomcat中session的内存结构大致如下?br />

W者以前用q的iPlanet也采用的是同L(fng)方式Q估计SunONE与iPlanet之间不会(x)有太大的差别。对于这U方式的服务器,解决的思\很简单,实际实行h也不?wbr>。要么让所有的应用E序׃n一个session idQ要么让应用E序能够获得其他应用E序的session id?/wbr>

iPlanet中有一U很单的Ҏ(gu)来实现共享一个session idQ那是把各个应用程序的cookie路径都设?Q实际上应该?NASAppQ对于应用程序来讲它的作用相当于?wbr>Q?br /><session-info>
<path>/NASApp</path>
</session-info>

需要注意的是,操作׃n的session应该遵@一些编E约?wbr>Q比如在session attribute名字的前面加上应用程序的前缀Q得setAttribute("name", "neo")变成setAttribute(" app1.name", "neo")Q以防止命名I间冲突Q导致互相覆盖?


在Tomcat中则没有q么方便的选择。在Tomcat版本3?wbr>Q我们还可以有一些手D|׃nsession。对于版?以上的TomcatQ目前笔者尚未发现简单的办法。只能借助于第三方的力?wbr>Q比如用文件、数据库、JMS或者客L(fng)cookieQURL参数或者隐藏字D늭手段?/wbr>

我们再看一下Weblogic Server是如何处理session的?br />

从截屏画面上可以看到Weblogic ServerҎ(gu)有的应用E序讄的cookie的\径都?Q这是不是意味着在Weblogic Server中默认的可以共享session?jin)?wbr>Q然而一个小实验卛_证明即不同的应用程序用的是同一个sessionQ各个应用程序仍然只能访问自己所讄的那些属?wbr>。这说明Weblogic Server中的session的内存结构可能如?br />

对于q样一U结构,在session机制本n上来解决session׃n的问题应该是不可能的?jin)。除?jin)借助于第三方的力?wbr>Q比如用文件、数据库、JMS或者客L(fng)cookieQURL参数或者隐藏字D늭手段Q还有一U较为方便的做法Q就是把一个应用程序的session攑ֈServletContext中,q样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,

应用E序A
context.setAttribute("appA", session);

应用E序B
contextA = context.getContext("/appA");
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");

值得注意的是q种用法不可ULQ因为根据ServletContext的JavaDocQ应用服务器可以处于安全的原因对于context.getContext("/appA");q回I|以上做法在Weblogic Server 8.1中通过?/wbr>

那么Weblogic ServerZ么要把所有的应用E序的cookie路径都设?wbr>/呢?原来是ؓ(f)?jin)SSOQ凡是共享这个session的应用程序都可以׃n认证的信息。一个简单的实验可以证明这一点,修改首先d的那个应用程序的描述Wweblogic.xmlQ把cookie路径修改?appA讉K另外一个应用程序会(x)重新?wbr>求登录,即是反q来Q先讉Kcookie路径?的应用程?wbr>Q再讉K修改q\径的q个Q虽然不再提C登录,但是d的用户信?wbr>也会(x)丢失。注意做q个实验时认证方式应该用FORMQ因为浏览器和web服务器对basic认证方式有其他的处理方式Q第二次h的认证不是通过session来实现的。具体请参看[7] secion 14.8 AuthorizationQ你可以修改所附的CZE序来做q些?wbr>验?/wbr>

八、ȝ
session机制本nq不复杂Q然而其实现和配|上的灵zL却?wbr>得具体情况复杂多变。这也要求我们不能把仅仅某一ơ的l验或者某一个浏览器Q服务器的经验当作普遍适用的经验,而是始终需要具体情?wbr>具体分析?/wbr>


--

房子{在上

alex-0927 2007-04-26 14:38 发表评论
]]>
认识的h多Q越惛_条狗Q.Q?/title><link>http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113022.html</link><dc:creator>alex-0927</dc:creator><author>alex-0927</author><pubDate>Mon, 23 Apr 2007 11:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113022.html</guid><wfw:comment>http://www.aygfsteel.com/alex-0927/comments/113022.html</wfw:comment><comments>http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/alex-0927/comments/commentRss/113022.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/alex-0927/services/trackbacks/113022.html</trackback:ping><description><![CDATA[ <font face="Courier New" size="2">莫名的夜里,梦见?jin)小时家里养的大白狗Q还象小旉L(fng)q它,感觉那样的塌实,温暖?br /><br />?j)里面突然想起?jin)那句话:(x)认识的h多Q越惛_条狗Q.Q?/font> <br /> <br />不管怎么P做过努力生活的h吧!<img src ="http://www.aygfsteel.com/alex-0927/aggbug/113022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/alex-0927/" target="_blank">alex-0927</a> 2007-04-23 19:50 <a href="http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>位运表C对象所处状?/title><link>http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113021.html</link><dc:creator>alex-0927</dc:creator><author>alex-0927</author><pubDate>Mon, 23 Apr 2007 11:39:00 GMT</pubDate><guid>http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113021.html</guid><wfw:comment>http://www.aygfsteel.com/alex-0927/comments/113021.html</wfw:comment><comments>http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/alex-0927/comments/commentRss/113021.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/alex-0927/services/trackbacks/113021.html</trackback:ping><description><![CDATA[ <p> <font face="Courier New" size="2">通过一个integercd属性来表示对象所处的状态:(x)<br /><br />CASE:<br />Invitor:邀(g)误(g)对象模?br />Integer Invitor.joinstatus:邀(g)误(g)所处参加状?br />当前存在状态声明:(x)是否被邀(g)P是否注册用户Q是否拒l,是否审批<br /><br />设计思\Q?br />bit0: 1-invited  , 0-not invited<br />bit1: 1-registed , 0-not registed<br />bit2: 1-refused  , 0-not refused<br />bit3: 1-approved , 0-not approved<br /><br />Example:0111(7)=the invitor is invited ,and is registed ,and has been refused without approved.<br /><br />//判断joinstatus状?br /><strong>public static</strong> String theStatusOfApplicant(Invitor iv) throws TrainingAppException {<br />  String status = "default";<br />  if (((iv.getJoinStatus() & 0x8) == 0) && ((iv.getJoinStatus() & 0x4) == 0)) {<br />   status = "default";// 待批?0x0)<br />  }<br />  if (((iv.getJoinStatus() & 0x8) == 0x8) && ((iv.getJoinStatus() & 0x4) == 0)) {<br />   status = "approved";// 已审?0x4)<br />  }<br />  if (((iv.getJoinStatus() & 0x4) > 0) && ((iv.getJoinStatus() & 0x8) == 0)) {<br />   status = "refused";// 已拒l?0x8)<br />  }<br />  return status;<br /> }<br />//更新joinstatus状?审批和拒lؓ(f)互斥)<br /><strong>private void</strong> updateJoinstatus(MainTrainingInfo mtrInfo, List<Invitor> invitors, Integer opertorType) {<br />  for (Iterator it = invitors.iterator(); it.hasNext();) {<br />   I(yng)nvitor iv = (Invitor) it.next();<br />   if (APPLY_OPERTORTYPE_APPROVE == opertorType.intValue()) { // approve<br />    iv.setJoinStatus((iv.getJoinStatus() | 0x8) & 0x8);<br />   } else {<br />    iv.setJoinStatus((iv.getJoinStatus() | 0x4) & 0x4); // refuse<br />   }<br />   iv.setMainId(mtrInfo);<br />   mtrInfo.getInvitor().add(iv);<br />  }</font> </p> <p> <font face="Courier New" size="2">  persistence.update(mtrInfo);<br />  if (APPLY_OPERTORTYPE_APPROVE == opertorType.intValue()) { // approve<br />   log.info(" ### 甌已获批准,发送邀(g)请邮?");<br />   // Send Mails.<br />   try {<br />    instanceMailSendService.approveInvitorSendMail(mtrInfo, invitors, getHostEmail(mtrInfo),<br />      MainTrainingInfoUtil.getLocale(mtrInfo), true, true);<br />   } catch (Exception e) {<br />    log.error(e.toString());<br />   }</font> </p> <p> <font face="Courier New" size="2">  }<br /> }</font> </p> <img src ="http://www.aygfsteel.com/alex-0927/aggbug/113021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/alex-0927/" target="_blank">alex-0927</a> 2007-04-23 19:39 <a href="http://www.aygfsteel.com/alex-0927/archive/2007/04/23/113021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Native SQL Supporthttp://www.aygfsteel.com/alex-0927/archive/2007/04/16/111058.htmlalex-0927alex-0927Mon, 16 Apr 2007 11:36:00 GMThttp://www.aygfsteel.com/alex-0927/archive/2007/04/16/111058.html 1.使用SQLQuery

对原生SQL查询执行的控制是通过SQLQuery接口q行的,通过执行Session.createSQLQuery()获取q个接口。最单的情况下,
可以采用以下形式Q?/font>

List cats = sess.createSQLQuery("select * from cats")
.addEntity(Cat.class)
.list();
q个查询指定?

SQL查询字符?/font>

查询q回的实?/font>

q里Q结果集字段名被假设Z映射文g中指明的字段名相同。对于连接了(jin)多个表的查询Q这可能造成问题Q因为可能在?br />个表中出现同样名字的字段。下面的Ҏ(gu)可以避免字D名重复的问?

List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class)
.list();
q个查询指定?

SQL查询语句Q它带一个占位符Q可以让Hibernate使用字段的别?

查询q回的实体,和它的SQL表的别名.

addEntity()Ҏ(gu)SQL表的别名和实体类联系hQƈ且确定查询结果集的Ş态?

addJoin()Ҏ(gu)可以被用于蝲入其他的实体和集合的兌.

List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.addEntity("cat", Cat.class)
.addJoin("kitten", "cat.kittens")
.list();
原生的SQL查询可能q回一个简单的标量值或者一个标量和实体的结合体?

Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE);
.uniqueResult();
除此之外Q你q可以在你的hbm文g中描q结果集映射信息Q在查询中用?/font>

List cats = sess.createSQLQuery(
"select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
)
.setResultSetMapping("catAndKitten")
.list();

2.命名SQL查询

可以在映文档中定义查询的名?可以象调用一个命名的HQL查询一L(fng)接调用命名SQL查询.在这U情况下,不需要调用addEntity()
Ҏ(gu).

<sql-query name="persons">
<return alias="person" class="eg.Person"/>
SELECT person.NAME AS {person.name},
person.AGE AS {person.age},
person.SEX AS {person.sex}
FROM PERSON person
WHERE person.NAME LIKE :namePattern
</sql-query>

List people = sess.getNamedQuery("persons")
.setString("namePattern", namePattern)
.setMaxResults(50)
.list();

在sping里面用回调查?br />    public List getPaysByBizId(final String bizId) {       
    return (List)getHibernateTemplate().execute(new HibernateCallback(){           
    public Object doInHibernate(Session session)throws HibernateException{               
    Query query = session.getNamedQuery("find.pays.by.bizid");               
    query.setParameter("bizId",bizId);               
    return query.list();           
    }       
    },true);   
    }

 



alex-0927 2007-04-16 19:36 发表评论
]]>
新注册的Blog,test...http://www.aygfsteel.com/alex-0927/archive/2007/04/14/110599.htmlalex-0927alex-0927Sat, 14 Apr 2007 02:17:00 GMThttp://www.aygfsteel.com/alex-0927/archive/2007/04/14/110599.html New blog,first post,test...



alex-0927 2007-04-14 10:17 发表评论
]]>
վ֩ģ壺 Ѱ| | | Һ| ɽʡ| | ̨| | Դ| | | | | ˰| | | | ˹| | | | | | | | | | | ɣ| | ¡| ƽ| α| | ²| | | | | ͩ®| Ȫ|