如何在FlexObject中直接使用HttpSession,很多新手都不清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。
我们可以使用远程对象作为服务门面,并使用应用服务器提供的持久服务来存储状态信息。
Flex Remote Object中直接使用HttpSession的方法
问题的背景
flexobject可以是POJO、JavaBean或EJB。在面向服务的体系结构中,我们可以使用远程对象作为服务外观,并使用应用服务器提供的持久服务来存储状态信息。
Flex不仅可以提供有状态或无状态的远程对象,还可以为mxml提供会话servlet来获取/存储会话中的内容。这一切听起来很* * *,但是有一个问题,Flex远程对象本身无法获取任何关于Running Context的信息,也就是说,你无法从你的远程对象获取HttpSession、HttpRequest和ServletContext。所谓的灵活会话servlet只让MXML获得会话的内容,而不是让远程对象直接获得会话。
为什么远程需要获取HttpRequest,HttpSession?
既然Flex提供了有状态远程对象,为什么远程对象要得到Running Context?问题是Flex中的有状态是基于应用服务器的http会话的,你无法控制AMFGateway建立远程对象的过程。举一个简单的例子,我们知道在一般的应用服务器中,会话的时间限制只有20分钟,而在许多系统中,有保持登录几个月的选项。
具体来说,是通过使用cookie存储id和密码哈希,并控制cookie的生存期来实现的。在服务器端,一旦会话过期,就可以从cookie中获取id和密码哈希,重新登录,从而达到自动认证用户的目的。
如果你的Flex远程对象不能得到HTTP HTTP HttpServletRequest,HttpSession,你就不能实现上面的情况。此外,对于小型应用程序,直接从Remote对象获取servlet上下文,并使用它来存储/获取共享资源,可以大大降低开发的复杂性。
解决方案
对于Flex远程对象来说,Httprequest和ServletContext并不是容易获得的东西。下面是我的一个方法,供大家参考。希望能成为大家拿出更好更有效的解决方案的好榜样。
这个方法的基本思想是使用JAVA提供的ThreadLocal Object。当服务器收到一个HTTP请求时,请求的整个过程在同一个线程中运行。
每个HTTP请求的处理将在自己独立的线程中运行。在Flex中,AMF远程对象的所有请求都需要通过AMF网关Servlet,远程对象的建立和调用也只是在这个HTTP请求的线程中运行。
根据这个原则,我们可以创建一个上下文对象。无论何时创建请求,我们都可以将其放在上下文的ThreadLocal中。当远程对象被AMF网关Servlet调用时,我们可以访问上下文的线程来获得相应的请求。
通过Servlet过滤器可以实现对发送到AMF网关的请求的拦截。别废话了,读代码!
1.将以下内容添加到web-INF/web.xml中。
Filter Filter-nameafsessionfilter/Filter-name Filter-classcom . netop . forum . servlet . amfsessionfilter/Filter-classfilter Filter-mapping Filter-nameafssession Filter/Filter-nameservlet-nameafgatewayservlet/servlet-name Filter-mapping 2。如何在Flex远程对象中使用AMFContext
classYouRemoteService { publicationservice method(){ AMFContextcontext=amfcontext。getcurrentcontext();HttpSession=上下文。getSession();ServletContext=context。getservletcontext();HttpServletRequestrequest=上下文。getrequest();httpservletresponse响应=上下文。getresponse();语境。setsessionattribute(' attr ',' value ');语境。setcontextattribute(' attr ',' value ');}}看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/86563.html