??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区在线观看视频在线观看,精品一区二区三区亚洲,亚洲深夜视频http://www.aygfsteel.com/esprit/category/7013.htmlAZA~AZA~FIGHTING......zh-cnWed, 28 Feb 2007 23:24:50 GMTWed, 28 Feb 2007 23:24:50 GMT60Session详解【{载?/title><link>http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html</link><dc:creator>esprit</dc:creator><author>esprit</author><pubDate>Fri, 17 Mar 2006 05:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html</guid><wfw:comment>http://www.aygfsteel.com/esprit/comments/35817.html</wfw:comment><comments>http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/esprit/comments/commentRss/35817.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/esprit/services/trackbacks/35817.html</trackback:ping><description><![CDATA[作者:(x)郎云鹏(dev2dev ID: hippiewolfQ?br /><br />摘要Q虽然session机制在web应用E序中被采用已经很长旉了,但是仍然有很多h不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制ƈ且对在Java web application中应用session机制时常见的问题作出解答?br /><br />目录Q?br />一、术语session<br />二、HTTP协议与状态保?br />三、理解cookie机制<br />四、理解session机制<br />五、理解javax.servlet.http.HttpSession<br />六、HttpSession常见问题<br />七、跨应用E序的session׃n<br />八、ȝ<br />参考文?br /><br />一、术语session<br />在我的经验里Qsessionq个词被滥用的程度大概仅ơ于transactionQ更加有的是transaction与session在某些语境下的含义是相同的?br /><br />sessionQ中文经常翻译ؓ(f)?x)话Q其本来的含义是指有始有l的一pd动作/消息Q比如打?sh)话时从拿v?sh)话拨号到挂断?sh)话这中间的一pdq程可以UCZ?session。有时候我们可以看到这L(fng)话“在一个浏览器?x)话期间Q?..”,q里的会(x)话一词用的就是其本义Q是指从一个浏览器H口打开到关闭这个期?①。最混ؕ的是“用P客户端)在一ơ会(x)话期间”这样一句话Q它可能指用L(fng)一pd动作Q一般情况下是同某个具体目的相关的一pd动作Q比如从d到选购商品到结账登样一个网上购物的q程Q有时候也被称Z个transactionQ,然而有时候也可能仅仅是指一ơ连接,也有可能是指含义①,其中的差别只能靠上下文来推断②?br /><br />然而当session一词与|络协议相关联时Q它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电(sh)话,直到Ҏ(gu)接了?sh)话通信才能开始,与此相对的是写信Q在你把信发出去的时候你q不能确认对方的地址是否正确Q通信渠道不一定能建立Q但对发信h来说Q通信已经开始了。“保持状态”则是指通信的一方能够把一pd的消息关联v来,使得消息之间可以互相依赖Q比如一个服务员能够认出再次光(f)的老顾客ƈ且记得上ơ这个顾客还?gu)Ơ店里一块钱。这一cȝ例子有“一个TCP session”或?“一个POP3 session”③?br /><br />而到了web服务器蓬勃发展的时代Qsession在web开发语境下的语义又有了新的扩展Q它的含义是指一cȝ来在客户端与服务器之间保持状态的解决Ҏ(gu)④。有时候session也用来指q种解决Ҏ(gu)的存储结构,如“把xxx保存在session 里”⑤。由于各U用于web开发的语言在一定程度上都提供了对这U解x案的支持Q所以在某种特定语言的语境下Qsession也被用来指代该语a的解x案,比如l常把Java里提供的javax.servlet.http.HttpSessionUCؓ(f)session⑥?br /><br />鉴于q种混ؕ已不可改变,本文中session一词的q用也会(x)Ҏ(gu)上下文有不同的含义,请大家注意分辨?br />在本文中Q用中文“浏览器?x)话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表辑֐义⑤Q用具体的“HttpSession”来表达含义?br /><br />二、HTTP协议与状态保?br />HTTP 协议本n是无状态的Q这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器h下蝲某些文gQ无论是客户端还是服务器都没有必要纪录彼此过ȝ行ؓ(f)Q每一ơ请求之间都是独立的Q好比一个顾客和一个自动售货机或者一个普通的Q非?x)员Ӟ大卖Z间的关系一栗?br /><br />然而聪明(或者贪心?Q的Z很快发现如果能够提供一些按需生成的动态信息会(x)使web变得更加有用Q就像给有线?sh)视加上?gu)功能一栗这U需求一斚wqHTML逐步d了表单、脚本、DOM{客L(fng)行ؓ(f)Q另一斚w在服务器端则出现了CGI规范以响应客L(fng)的动态请求,作ؓ(f)传输载体的HTTP协议也添加了文g上蝲?cookieq些Ҏ(gu)。其中cookie的作用就是ؓ(f)了解决HTTP协议无状态的~陷所作出的努力。至于后来出现的session机制则是又一U在客户端与服务器之间保持状态的解决Ҏ(gu)?br /><br />让我们用几个例子来描qC下cookie和session机制之间的区别与联系。笔者曾l常ȝ一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠Q然而一ơ性消?杯咖啡的Z(x)微乎其微Q这时就需要某U方式来U录某位֮的消Ҏ(gu)量。想象一下其实也无外乎下面的几种Ҏ(gu)Q?br />1、该店的店员很厉宻I能记住每位顾客的消费数量Q只要顾客一走进咖啡店,店员q道该怎么对待了。这U做法就是协议本w支持状态?br />2、发l顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每ơ消Ҏ(gu)Q如果顾客出C张卡片,则此ơ消费就?x)与以前或以后的消费相联pv来。这U做法就是在客户端保持状态?br />3、发l顾客一张会(x)员卡Q除了卡号之外什么信息也不纪录,每次消费Ӟ如果֮出示该卡片,则店员在店里的纪录本上找到这个卡号对应的U录d一些消费信息。这U做法就是在服务器端保持状态?br /><br />׃HTTP协议是无状态的Q而出于种U考虑也不希望使之成ؓ(f)有状态的Q因此,后面两种Ҏ(gu)成为现实的选择。具体来说cookie机制采用的是在客L(fng)保持状态的Ҏ(gu)Q而session机制采用的是在服务器端保持状态的Ҏ(gu)。同时我们也看到Q由于采用服务器端保持状态的Ҏ(gu)在客L(fng)也需要保存一个标识,所以session机制可能需要借助于cookie机制来达C存标识的目的Q但实际上它q有其他选择?br /><br />三、理解cookie机制 <br />cookie机制的基本原理就如上面的例子一L(fng)单,但是q有几个问题需要解冻I(x)“会(x)员卡”如何分发;“会(x)员卡”的内容Q以?qing)客户如何用“会(x)员卡”?br /><br />正统的cookie分发是通过扩展HTTP协议来实现的Q服务器通过在HTTP的响应头中加上一行特D的指示以提C浏览器按照指示生成相应的cookie。然而纯_的客户端脚本如JavaScript或者VBScript也可以生成cookie?br /><br />而cookie 的用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器(g)查所有存储的cookieQ如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置Q则把该cookie附在h资源的HTTPh头上发送给服务器。意思是麦当劳的?x)员卡只能在麦当劳的店里出示Q如果某家分店还发行了自q?x)员卡,那么q这家店的时候除了要出示麦当劳的?x)员卡,q要出示q家店的?x)员卡?br /><br />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 />路径与域合在一起就构成了cookie的作用范围?br />如果不设|过期时_(d)则表C个cookie的生命期为浏览器?x)话期间Q只要关闭浏览器H口Qcookie消׃。这U生命期为浏览器?x)话期?cookie被称Z(x)话cookie。会(x)话cookie一般不存储在硬盘上而是保存在内存里Q当然这U行为ƈ不是规范规定的。如果设|了q期旉Q浏览器׃(x)把cookie保存到硬盘上Q关闭后再次打开览器,q些cookie仍然有效直到过讑֮的过期时间?br /><br />存储在硬盘上的cookie 可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方式。对于IEQ在一个打开的窗口上?Ctrl-NQ或者从文g菜单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序开发者造成很大的困扰?br /><br />下面是一个goolge讄cookie的响应头的例?br />HTTP/1.1 302 Found<br />Location: http://www.google.com/intl/zh-CN/<br />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<br />Content-Type: text/html<br /><img height="293" alt="image002.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image002.jpg" width="408" border="0" /><br />q是使用HTTPLookq个HTTP Sniffer软g来俘L(fng)HTTP通讯U录的一部分<br /><img height="344" alt="image004.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image004.jpg" width="432" border="0" /><br />览器在再次讉Kgoolge的资源时自动向外发送cookie<br /><img height="305" alt="image006.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image006.jpg" width="421" border="0" /><br />使用Firefox可以很容易的观察现有的cookie的?br />使用HTTPLook配合F(tun)irefox可以很容易的理解cookie的工作原理?br /><img height="248" alt="image008.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image008.jpg" width="324" border="0" /><br />IE也可以设|在接受cookie前询?br /><img height="249" alt="image010.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image010.jpg" width="239" border="0" /><br />q是一个询问接受cookie的对话框?br />四、理解session机制<br />session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)来保存信息?br /><br />当程序需要ؓ(f)某个客户端的h创徏一个session的时候,服务器首先检查这个客L(fng)的请求里是否已包含了一个session标识 - UCؓ(f) session idQ如果已包含一个session id则说明以前已lؓ(f)此客L(fng)创徏qsessionQ服务器按照session id把这?session(g)索出来用(如果(g)索不刎ͼ可能?x)新Z个)Q如果客L(fng)h不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会(x)重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个 session id被在本ơ响应中q回l客L(fng)保存?br /><br />保存q个session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类gSEEESIONIDQ而。比如weblogic对于web应用E序生成的cookieQJSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就?JSESSIONID?br /><br />׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓ(f)URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />另一U是作ؓ(f)查询字符串附加在URL后面Q表现Ş式ؓ(f)http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />q两U方式对于用h说是没有区别的,只是服务器在解析的时候处理的方式不同Q采用第一U方式也有利于把session id的信息和正常E序参数区分开来?br />Z在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session id?br /><br />另一U技术叫做表单隐藏字Dc(din)就是服务器?x)自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器。比如下面的表单<br /><form name="testform" action="/xxx"><br /><input type="text"><br /></form><br />在被传递给客户端之前将被改写成<br /><form name="testform" action="/xxx"><br /><input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"><br /><input type="text"><br /></form><br />q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了q种技术?br />实际上这U技术可以简单的用对action应用URL重写来代ѝ?br /><br />在谈论session机制的时候,常常听到q样一U误解“只要关闭浏览器Qsession消׃”。其实可以想象一下会(x)员卡的例子,除非֮d对店家提出销卡,否则店家l对不会(x)L删除֮的资料。对session来说也是一L(fng)Q除非程序通知服务器删除一个sessionQ否则服务器?x)一直保留,E序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会(x)d在关闭之前通知服务器它?yu)要关闭Q因此服务器Ҏ(gu)不会(x)有机?x)知道浏览器已经关闭Q之所以会(x)有这U错觉,是大部分session机制都用会(x)话cookie来保存session idQ而关闭浏览器后这?session id消׃Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘上,或者用某U手D|写浏览器发出的HTTPh_(d)把原来的session id发送给服务器,则再ơ打开览器仍然能够找到原来的session?br /><br />恰恰是由于关闭浏览器不会(x)Dsession被删除,q服务器ؓ(f)seesion讄了一个失效时_(d)当距dL(fng)上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L(fng)已经停止了活动,才会(x)把session删除以节省存储空间?br /><br />五、理解javax.servlet.http.HttpSession<br />HttpSession是Javaq_对session机制的实现规范,因ؓ(f)它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然?x)有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作ؓ(f)例子来演C?br /><br />首先QW(xu)eblogic Server提供了一pd的参数来控制它的HttpSession的实玎ͼ包括使用cookie的开关选项Q用URL重写的开关选项Qsession持久化的讄Qsession失效旉的设|,以及(qing)针对cookie的各U设|,比如讄cookie的名字、\径、域Q?cookie的生存时间等?br /><br />一般情况下Qsession都是存储在内存里Q当服务器进E被停止或者重启的时候,内存里的session也会(x)被清I,如果讄了session的持久化Ҏ(gu),服务器就?x)把session保存到硬盘上Q当服务器进E重新启动或q些信息能够被再次使用Q?Weblogic Server支持的持久性方式包括文件、数据库、客L(fng)cookie保存和复制?br /><br />复制严格说来不算持久化保存,因ؓ(f)session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进E中Q这样即使某个服务器q程停止工作也仍然可以从其他q程中取得session?br /><br />cookie生存旉的设|则?x)?jing)响浏览器生成的cookie是否是一个会(x)话cookie。默认是使用?x)话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解?br /><br />cookie的\径对于web应用E序来说是一个非帔R要的选项QW(xu)eblogic Server对这个选项的默认处理方式得它与其他服务器有明昄区别。后面我们会(x)专题讨论?br /><br />关于session的设|参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869<br /><br />六、HttpSession常见问题<br />Q在本小节中session的含义ؓ(f)⑤和⑥的混合Q?br /><br /><br />1、session在何时被创徏<br />一个常见的误解是以为session在有客户端访问时p创徏Q然而事实是直到某server端程序调?HttpServletRequest.getSession(true)q样的语句时才被创徏Q注意如果JSP没有昄的用?lt;% @page session="false"%> 关闭sessionQ则JSP文g在编译成Servlet时将?x)自动加上这样一条语?HttpSession session = HttpServletRequest.getSession(true);q也是JSP中隐含的 session对象的来历?br /><br />׃session?x)消耗内存资源,因此Q如果不打算使用sessionQ应该在所有的JSP中关闭它?br /><br />2、session何时被删?br />l合前面的讨论,session在下列情况下被删除a.E序调用HttpSession.invalidate();或b.距离上一ơ收到客L(fng)发送的session id旉间隔过了session的超时设|?或c.服务器进E被停止Q非持久sessionQ?br /><br />3、如何做到在览器关闭时删除session<br />严格的讲Q做不到q一炏V可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进E这些非常规手段仍然无能为力?br /><br />4、有个HttpSessionListener是怎么回事<br />你可以创L(fng)listenerȝ控session的创建和销毁事Ӟ使得在发生这L(fng)事g时你可以做一些相应的工作。注意是session的创建和销毁动作触发listenerQ而不是相反。类似的与HttpSession有关的listenerq有 HttpSessionBindingListenerQHttpSessionActivationListener?HttpSessionAttributeListener?br /><br />5、存攑֜session中的对象必须是可序列化的?br />不是必需的。要求对象可序列化只是ؓ(f)了session能够在集中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放|一个不可序列化的对象在控制C?x)收C个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象Q在session销毁时?x)有一个ExceptionQ很奇怪?br /><br />6、如何才能正的应付客户端禁止cookie的可能?br />Ҏ(gu)有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URLQ具体做法参见[6]<br />http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770<br /><br />7、开两个览器窗口访问应用程序会(x)使用同一个sessionq是不同的session<br />参见W三节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器Q不同的H口打开方式以及(qing)不同的cookie存储方式都会(x)对这个问题的{案有媄(jing)响?br /><br />8、如何防止用h开两个览器窗口操作导致的session混ؕ<br />q个问题与防止表单多ơ提交是cM的,可以通过讄客户端的令牌来解冟뀂就是在服务器每ơ生成一个不同的idq回l客L(fng)Q同时保存在session里,客户端提交表单时必须把这个id也返回服务器Q程序首先比较返回的id与保存在session里的值是否一_(d)如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表C层模式的部分。需要注意的是对于用javascript window.open打开的窗口,一般不讄q个idQ或者用单独的idQ以防主H口无法操作Q徏议不要再window.open打开的窗口里做修Ҏ(gu)作,q样可以不用设|?br /><br />9、ؓ(f)什么在Weblogic Server中改变session的值后要重新调用一ơsession.setValue<br />做这个动作主要是Z在集环境中提示Weblogic Server session中的值发生了改变Q需要向其他服务器进E复制新的session倹{?br /><br />10、ؓ(f)什么session不见?br />排除session正常失效的因素之外,服务器本w的可能性应该是微乎其微的,虽然W者在iPlanet6SP1加若q补丁的Solaris版本上倒也遇到q;览器插件的可能性次之,W者也遇到q?721插g造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会(x)出现问题?br />出现q一问题的大部分原因都是E序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨个问题?br /><br />七、跨应用E序的session׃n<br /><br />常常有这L(fng)情况Q一个大目被分割成若干项目开发,Z能够互不q扰Q要求每个小目作ؓ(f)一个单独的web应用E序开发,可是C最后突然发现某几个项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on)Q在session中保存login的用户信息,最自然的要求是应用E序间能够访问彼此的session?br /><br />然而按照Servlet规范Qsession的作用范围应该仅仅限于当前应用程序下Q不同的应用E序之间是不能够互相讉KҎ(gu)的session的。各个应用服务器从实际效果上都遵守了q一规范Q但是实现的l节却可能各有不同,因此解决跨应用程序session׃n的方法也各不相同?br /><br />首先来看一下Tomcat是如何实现web应用E序之间session的隔ȝQ从 Tomcat讄的cookie路径来看Q它对不同的应用E序讄的cookie路径是不同的Q这样不同的应用E序所用的session id是不同的Q因此即使在同一个浏览器H口里访问不同的应用E序Q发送给服务器的session id也可以是不同的?br /><br /><img height="219" alt="image012.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image012.jpg" width="288" border="0" /><img height="215" alt="image014.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image014.jpg" width="257" border="0" /><br />  <br /><br />Ҏ(gu)q个Ҏ(gu),我们可以推测Tomcat中session的内存结构大致如下?br /><br /><img height="278" alt="image016.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image016.jpg" width="444" border="0" /><br /> <br /><br />W者以前用q的iPlanet也采用的是同L(fng)方式Q估计SunONE与iPlanet之间不会(x)有太大的差别。对于这U方式的服务器,解决的思\很简单,实际实行h也不难。要么让所有的应用E序׃n一个session idQ要么让应用E序能够获得其他应用E序的session id?br /><br />iPlanet中有一U很单的Ҏ(gu)来实现共享一个session idQ那是把各个应用程序的cookie路径都设?Q实际上应该?NASAppQ对于应用程序来讲它的作用相当于根)?br /><session-info><br /><path>/NASApp</path><br /></session-info><br /><br />需要注意的是,操作׃n的session应该遵@一些编E约定,比如在session attribute名字的前面加上应用程序的前缀Q?setAttribute("name", "neo")变成setAttribute("app1.name", "neo")Q以防止命名I间冲突Q导致互相覆盖?br /><br /><br />在Tomcat中则没有q么方便的选择。在Tomcat版本3上,我们q可以有一些手D|׃nsession。对于版?以上的TomcatQ目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文g、数据库、JMS或者客L(fng)cookieQURL参数或者隐藏字D늭手段?br /><br />我们再看一下Weblogic Server是如何处理session的?br /><br /><br />  <img height="208" alt="image018.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image018.jpg" width="288" border="0" /><img height="207" alt="image020.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image020.jpg" width="269" border="0" /><br /><br />从截屏画面上可以看到Weblogic ServerҎ(gu)有的应用E序讄的cookie的\径都?Q这是不是意味着在Weblogic Server中默认的可以共享session了呢Q然而一个小实验卛_证明即不同的应用程序用的是同一个sessionQ各个应用程序仍然只能访问自己所讄的那些属性。这说明Weblogic Server中的session的内存结构可能如?br /><br /><img height="290" alt="image022.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image022.jpg" width="420" border="0" /><br /> <br /><br />对于q样一U结构,?session机制本n上来解决session׃n的问题应该是不可能的了。除了借助于第三方的力量,比如使用文g、数据库、JMS或者客L(fng) cookieQURL参数或者隐藏字D늭手段Q还有一U较为方便的做法Q就是把一个应用程序的session攑ֈServletContext中,q样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,<br /><br />应用E序A<br />context.setAttribute("appA", session); <br /><br />应用E序B<br />contextA = context.getContext("/appA");<br />HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); <br /><br />值得注意的是q种用法不可ULQ因为根据ServletContext的JavaDocQ应用服务器可以处于安全的原因对于context.getContext("/appA");q回I|以上做法在Weblogic Server 8.1中通过?br /><br />那么Weblogic ServerZ么要把所有的应用E序的cookie路径都设?呢?原来是ؓ(f)了SSOQ凡是共享这个session的应用程序都可以׃n认证的信息。一个简单的实验可以证明这一点,修改首先d的那个应用程序的描述Wweblogic.xmlQ把cookie路径修改?appA 讉K另外一个应用程序会(x)重新要求dQ即使是反过来,先访问cookie路径?的应用程序,再访问修改过路径的这个,虽然不再提示dQ但是登录的用户信息也会(x)丢失。注意做q个实验时认证方式应该用FORMQ因为浏览器和web服务器对basic认证方式有其他的处理方式Q第二次h的认证不是通过 session来实现的。具体请参看[7] secion 14.8 AuthorizationQ你可以修改所附的CZE序来做q些试验?br /><br />八、ȝ<br />session机制本nq不复杂Q然而其实现和配|上的灵zL却使得具体情况复杂多变。这也要求我们不能把仅仅某一ơ的l验或者某一个浏览器Q服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析?br /><br />关于作者:(x)<br />郎云鹏(dev2dev ID: hippiewolfQ,软g工程师,从事J2EE开?br />?sh)子邮gQlangyunpeng@yahoo.com.cn<br />地址Q大qY件园?1L(fng)技大厦A座大q博涵咨询服务有限公?br /><br />参考文档:(x)<br />[1] Preliminary Specification http://wp.netscape.com/newsref/std/cookie_spec.html<br />[2] RFC2109 http://www.rfc-editor.org/rfc/rfc2109.txt<br />[3] RFC2965 http://www.rfc-editor.org/rfc/rfc2965.txt<br />[4] The Unofficial Cookie FAQ http://www.cookiecentral.com/faq/<br />[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869<br />[6] http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770<br />[7] RFC2616 <a >http://www.rfc-editor.org/rfc/rfc2616.txt</a><br /><img src ="http://www.aygfsteel.com/esprit/aggbug/35817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/esprit/" target="_blank">esprit</a> 2006-03-17 13:43 <a href="http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下EclipseQMyeclipse安装http://www.aygfsteel.com/esprit/archive/2006/01/19/28628.htmlespritespritThu, 19 Jan 2006 03:03:00 GMThttp://www.aygfsteel.com/esprit/archive/2006/01/19/28628.htmlhttp://www.aygfsteel.com/esprit/comments/28628.htmlhttp://www.aygfsteel.com/esprit/archive/2006/01/19/28628.html#Feedback1http://www.aygfsteel.com/esprit/comments/commentRss/28628.htmlhttp://www.aygfsteel.com/esprit/services/trackbacks/28628.html我这Ҏ(gu)用的是eclipse3.1 + Myeclipse4.0?BR>
下蝲必要的YӞ(x)
      eclipse-SDK-3.1-linux-gtk.tar.gzQ?A >http://download.eclipse.org/eclipse/downloads/drops/R-3.1-200506271435/index.php
   EnterpriseWorkbenchInstaller_4.0GA_E3.1.binQ?A >http://downloads.myeclipseide.com/downloads/products/eworkbench/4.0GA/EnterpriseWorkbenchInstaller_4.0GA_E3.1.bin
   myeclipse_4_0_keygen.exeQ?A >http://www.matrix.org.cn/resource/upload/content/2005_09_02_094042_poSETmYBSq.rar

安装EclipseQ?BR>
   其实安装Eclipseq是蛮简单的Q我q边其解压?usr/java目录?BR>   [root@esprit java]tar -zxvf /PATH/eclipse-SDK-3.1-linux-gtk.tar.gz
   q里PATH是你存放eclipse-SDK-3.1-linux-gtk.tar.gz的目录,解压后,?usr/java目录下就有了eclipseq个目录
   接下来,我来为eclipse创徏一个图形界面快速启动项Q类gwindows下的桌面快捷方式Q,叛_囑Ş界面——〉选择"新徏启动?New Launcher)"——〉名UͼNameQ输入Eclipse——〉命令(CommandQ选择Eclipse解压目录/usr/java/eclipse——〉图标(IconQ可以选择Eclipse的图标——〉点ȝ定完成,然后你就可以双击囑Ş界面中的快速启动来启动你的eclipse了,当然也可以在shell下执行eclipse根目录下的执行文件来启动eclipseQ?BR>   eclipse启动后还需要一些必要的配置Q这里就不讲?

安装MyeclipseQ?BR>
   下面来安装MyeclipseQMyeclipse的安装跟windows下的安装q无多大区别
   shell下执?SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">EnterpriseWorkbenchInstaller_4.0GA_E3.1.bin文gQ?BR>   [root@esprit java]# ./PATH/EnterpriseWorkbenchInstaller_4.0GA_E3.1.bin
   按回车后它会(x)先检你pȝ中的环境Q待(g)完毕,正常的话?x)出现Myeclipse安装画面Q这下来的操作跟windows下的操作是一L(fng)Q这里面?x)先让你选择eclipse的安装目录,我这里就?usr/java/eclipseQ然后再选择安装目录Q输?usr/java/myeclipseQ然后一路nextp?^_^
   安装完成后,启动eclipseQ点击菜单项Help——〉Software Updates——〉Manager Configuration
   在打开的窗口中可以看到已经有myeclipse在那里了
   接着我们来运行myeclipse_4_0_keygen.exeQ这个我是在windows下执行的Q得到注册码后,eclipse中选择Myeclipse——〉Update SubscriptionQ弹出的H口中输入刚才得到的注册码确定,完成注册Q?BR>
配置TomcatQ?BR>
   eclipse中选择window——〉preferencesQ在弹出的窗口选择Myeclipse——〉Application Servers——〉Tomcat5
接着在Tomcat serverq里选择"Enable",下面Tomcat Home Directory选择你tomcat安装的目录,然后右下角的Apply应用Q确定退出!Qlinuxq不太熟Q就不截图了 Q?BR>
到这里,Java 开发的环境是搭徏完了Q可以做你想做了Q?IMG height=19 src="http://www.aygfsteel.com/Emoticons/teeth_smile.gif" width=19 border=0>
   


esprit 2006-01-19 11:03 发表评论
]]>
Linux下TomcatQMysql安装http://www.aygfsteel.com/esprit/archive/2006/01/18/28536.htmlespritespritWed, 18 Jan 2006 09:35:00 GMThttp://www.aygfsteel.com/esprit/archive/2006/01/18/28536.htmlhttp://www.aygfsteel.com/esprit/comments/28536.htmlhttp://www.aygfsteel.com/esprit/archive/2006/01/18/28536.html#Feedback0http://www.aygfsteel.com/esprit/comments/commentRss/28536.htmlhttp://www.aygfsteel.com/esprit/services/trackbacks/28536.html
1.下蝲相关软gQ?BR>      jakarta-tomcat-5.0.28.tar.gz:http://mirror.vmmatrix.net/apache/tomcat/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28.tar.gz
   mysql-standard-5.0.18-linux-i686-glibc23.tar.gz:http://dev.mysql.com/downloads/mysql/5.0.html
   我下载的都是源码包,所以解压到指定目录卛_
2.先来安装mysqlQ?BR>   [root@esprit local]# groupadd mysql               #d一个用L(fng)mysql
   [root@esprit local]# useradd -g mysql mysql      #d一个用户mysql到组mysql
   [root@esprit local]# tar -zxvf /PATH/mysql-standard-5.0.18-linux-i686-glibc23.tar.gz    #q里的PATH是你的mysql包放|的目录Q我q里解压?usr/local目录?BR>   [root@esprit local]# ln -s mysql-standard-5.0.18-linux-i686-glibc23 mysql      #创徏一个文仉?BR>   [root@esprit local]# cd mysql
   [root@esprit mysql]# scripts/mysql_install_db --user=mysql            #初始化数据库Q创建数据库和表Q?BR>   修改文g的所有者:(x)   
   [root@esprit mysql]# chown -R root .
   [root@esprit mysql]# chown -R mysql data
   [root@esprit mysql]# chgrp -R mysql .
   接下来我们可以启动mysql了:(x)
   [root@esprit mysql]# bin/mysqld_safe --user=mysql &
   启动后我们可以用mysql -u root -p dQ默认密码ؓ(f)I?BR>   可以通过mysqladmin -u root -p password 新密码来修改密码
   好了Qmysql的安装就到这里!
3.安装TomcatQ?BR>   [root@esprit java]# tar -zxvf /PATH/jakarta-tomcat-5.0.28.tar.gz      #同样q里的PATH是你tomcat包放|的目录Q我q里解压?usr/java目录?BR>   [root@esprit java]# ln -s jakarta-tomcat-5.0.28 tomcat                #同样创徏一个文仉?BR>   接下来配|CATALINA_HOME:   
   [root@esprit java]# vi /etc/profile
   在文件尾d 
   CATALINA_HOME=/usr/java/tomcat
   export CATALINA_HOME
   :wq 保存退?BR>   重新启动pȝ佉K|生?BR>   接着可以启动tomcat?nbsp;  
   [root@esprit tomcat]# bin/startup.sh
   正常的话?x)看到shell下输出:(x)
   Using CATALINA_BASE:   /usr/java/tomcat
   Using CATALINA_HOME:   /usr/java/tomcat
   Using CATALINA_TMPDIR: /usr/java/tomcat/temp
   Using JAVA_HOME:       /usr/java/jdk1.5.0_06
   然后在浏览器中输入:(x)http://localhost:8080 ׃(x)出现tomcatƢ迎面 ^_^
   假如发生了错误你可以察看/logs/catalina.outq个文gQ?BR>4.理tomcat
   [root@esprit tomcat]# vi conf/tomcat-users.xml
   ?lt;tomcat-users>?lt;/tomcat-users>之间加入Q?BR>   <user username="admin" password="admin" roles="admin,manager"/>
   q样览器中输入:http://localhost:8080/admin d后就可以来管理了
   输入http://localhost:8080/manager/html 来管理你的工E项目了


好了Q先说这么多了!嘿嘿—?BR>
   


esprit 2006-01-18 17:35 发表评论
]]>
Linux下jdk的安?/title><link>http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html</link><dc:creator>esprit</dc:creator><author>esprit</author><pubDate>Wed, 18 Jan 2006 07:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html</guid><wfw:comment>http://www.aygfsteel.com/esprit/comments/28489.html</wfw:comment><comments>http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/esprit/comments/commentRss/28489.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/esprit/services/trackbacks/28489.html</trackback:ping><description><![CDATA[ <p>q两天闲着没事Q就用VMware装了个LinuxQRedHat9.0Q玩玩,现记录linux下java环境的配|?br /><br />1.下蝲Q?font face="Simsun"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br />   地址Q?a >http://java.sun.com/j2se/1.5.0/download.jsp</a><br /></span></font><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">2.l文件加上可执行权限<br />   [root@esprit java]# chmod +x <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br />3.执行<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br /></span></span>   [root@esprit java]# ./<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br />   执行后生?span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm<br />4.安装<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm<br /></span></span></span>   [root@esprit java]# rpm -ivh <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm</span><br style="mso-special-character: line-break" />   q里我jdk安装?usr/java目录?br />5.配置环境变量<br />   环境变量配置有三U方法(分别是:(x)修改/etc/profile文gQ修改用L(fng)录下?bashrc文gQ直接在shell下修改)<br />q里我只讲我用到的修?etc/profile文g<br />   [root@esprit java]# vi /etc/profile<br />   打开文g后,?I 键,在文件后dQ?br /></span></p> <p> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">JAVA_HOME</span> <span style="COLOR: #000000">=/</span> <span style="COLOR: #000000">usr</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">java</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">jdk1.</span> <span style="COLOR: #000000">5</span> <span style="COLOR: #000000">.0_06<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />PATH</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">$JAVA_HOME</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">bin:$PATH<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />CLASSPATH</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">.:$JAVA_HOME</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">lib</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">tools.jar:$JAVA_HOME</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">lib</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">dt.jar<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />export JAVA_HOME PATH CLASSPATH<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span> </div> <p>   按esc ?br />   输入:wq 保存退出?br />   重新d<br />6.试配置环境<br />   写个单的HelloWorld来测试一?br />   [root@esprit java]# vi HelloWorld.java<br />   文g中输入:(x)   </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img id="Codehighlighter1_23_125_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_125_Open_Text.style.display='none'; Codehighlighter1_23_125_Closed_Image.style.display='inline'; Codehighlighter1_23_125_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_23_125_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_125_Closed_Text.style.display='none'; Codehighlighter1_23_125_Open_Image.style.display='inline'; Codehighlighter1_23_125_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000"> HelloWorld</span> <span id="Codehighlighter1_23_125_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_23_125_Open_Text"> <span style="COLOR: #000000">{<br /><img id="Codehighlighter1_66_123_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_123_Open_Text.style.display='none'; Codehighlighter1_66_123_Closed_Image.style.display='inline'; Codehighlighter1_66_123_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_66_123_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_123_Closed_Text.style.display='none'; Codehighlighter1_66_123_Open_Image.style.display='inline'; Codehighlighter1_66_123_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> main(String args[])</span> <span id="Codehighlighter1_66_123_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_66_123_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />      System.out.println(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Hello World in Linux!!</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <p>   :wq 保存退?br />   [root@esprit java]# javac HelloWorld.java<br />   没有错误Q接着<br />   [root@esprit java]# java HelloWorld<br />   shell下输?<font size="2">Hello World in Linux!!<br /></font>   成功了!^_^<br />   </p> <img src ="http://www.aygfsteel.com/esprit/aggbug/28489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/esprit/" target="_blank">esprit</a> 2006-01-18 15:05 <a href="http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ֺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Ž</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ٸ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͷ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ű</a>| <a href="http://" target="_blank">üɽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ָ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֻ</a>| <a href="http://" target="_blank">ͩ</a>| <a href="http://" target="_blank">ϽϽ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>