`

Flex获得session的方法

    博客分类:
  • Flex
 
阅读更多
1. 使用Blazeds与JAVA后台通信的 可以通过以下方案获取Session中的信息 FlexContext.getFlexSession().getAttribute(att); 2. Flex Remote Object中直接使用HttpSession的方法 问题的背景 Flex Remote Object可以是POJO,JavaBean或是EJB。在面向服务的架构中(Service Oriented Architecture),我们可以用Remote Object来作为Service Facade,利用应用服务 器提供的persistent service来储存状态信息。 Flex既可以提供stateful或stateless的remote object, 另外还有session servlet让mxml 获取/和储存session中的内容。这一切听上去都很完美,但是有一个问题,Flex Remote Object本身是无法获得任何有关Running Context的信息,也就是说,你无法从你的 Remote Object 中获得 HttpSession, HttpRequest 和 ServletContext。 所谓的 Flex Session servlet只是让 MXML获得session的内容,而不是直接让Remote Object获得session。 Remote Object为什么需要获得HttpRequest, HttpSession? 既然Flex提供了stateful的remote object为什么还要让remote object获得Running Context呢?问题在于Flex中的stateful是基于应用服务器的http session,而且你无法控 制AMFGateway建立remote object的过程。打个简单的比方,我们知道一般的应用服务器中,session的时限只有20分 钟,而在很多系统的登陆过程中却有选择保持登陆几个月的选项。 其具体实现上就是利用cookie来储存id和password hash,通过控制cookie的存活时间来实 现的。而在服务器端,一旦session过期了,则可以从cookie中获得id和password hash重新 登陆一遍,从而达到自动认证用户的目的。 如果你的Remote Object无法获得 HttpServletRequest, HttpSession,你就无法实现上述 的情况。另外,对于小型的应用来说,直接在Remote object中获得servlet context并利用 它来储存/获得共享的资源,可以大大降低开发的复杂程度。 解决方案 要让Remote Object获得HttpSession,HttpRequest和ServletContext并不是一件容易的事情 。这里提供了我的一种方法,供大家参考。希望能抛砖引玉,让大家提出更好,更有效的方 案。 这个方法的基本思路是利用JAVA提供的 ThreadLocal Object。当服务器接收到一个HTTP请 求后,这个请求的整个处理过程是运行在同一个线程中的。 每个HTTP请求的处理会都运行在各自独立的线程中。而在Flex中,所有AMF Remote Object 的请求都需要通过 AMF Gateway Servlet,而Remote Object 的建立和调用恰恰就是运行在 这个HTTP请求的线程中。 有了这个原则,我们就可以建立一个Context Object,每当请求建立的时候,就可以把这个 请求放入 Context 的 ThreadLocal 中,而当 Remote Object 被AMF Gateway Servlet调用 的时候,就可以通过访问 Context 的ThreadLoca l来获得其所对应的那个请求。 而截获发送到AMF Gateway的请求则可以通过Servlet Filter来实现。废话不说了,看代码 吧! 1. 添加以下内容到WEB-INF/web.xml中 <filter><filter-name>AMFSessionFilter </filter-name><filter-class>com.netop.forum.servlets.AMFSessionFilter </filter-class><filter><filter-mapping><filter-name>AMFSessionFilter </filter-name><servlet-name>AMFGatewayServlet </servlet-name><filter-mapping> 2. AMFSessionFilter的代码 package com.netop.forum.servlets; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class AMFSessionFilter implements Filter { private static Log log = LogFactory.getLog(AMFSessionFilter.class); public void init(FilterConfig config) { log.info("Init AMFSessionFilter filter"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException,IOException { AMFContext.setCurrentContext((HttpServletRequest)request, (HttpServletResponse)response); chain.doFilter(request,response); } public void destroy() { log.info("Destory AMFSessionFilter filter"); } } 3. AMFContext的代码 package com.netop.forum.servlets; import javax.servlet.*; import javax.servlet.http.*; import com.netop.forum.business.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class AMFContext { public final static String CONNECTION_FACTORY_KEY = "sqlMapFactory"; private static Log log = LogFactory.getLog(AMFContext.class); private static ThreadLocal tl = new ThreadLocal(); static public void setCurrentContext(HttpServletRequest request, HttpServletResponse response) { AMFContext c = getCurrentContext(); if (c == null) { c = new AMFContext(request,response); tl.set(c); } else { c.setRequest(request); c.setResponse(response); } } static public AMFContext getCurrentContext() { return (AMFContext)tl.get(); } //---------------------------------------------------------- // // Class members // //---------------------------------------------------------- private HttpServletRequest request; private HttpServletResponse response; private AMFContext (HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response; } public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } public ServletContext getServletContext() { HttpSession session = this.getSession(); return session.getServletContext(); } public HttpSession getSession() { return request.getSession(); } public Object getSessionAttribute(String attr) { HttpSession session = this.getSession(); return session.getAttribute(attr); } public void setSessionAttribute(String attr, Object value) { HttpSession session = this.getSession(); session.setAttribute(attr, value); } public Object getContextAttribute(String attr) { ServletContext sc = this.getServletContext(); return sc.getAttribute(attr); } public void setContextAttribute(String attr, Object value) { ServletContext sc = this.getServletContext(); sc.setAttribute(attr,value); } public Object getRequestAttribute(String attr) { return request.getAttribute(attr); } public void setRequestAttribute(String attr, Object value) { request.setAttribute(attr,value); } public ConnectionFactory getConnectionFactory() { ConnectionFactory factory =(ConnectionFactory)this.getContextAttribute(CONNECTION_FACTORY_KEY); if (factory == null) { try { factory = new ConnectionFactory(); // factory is lazy instantiated, so we need to invoke it once to make sure it is ok. factory.getSqlMap(); this.setContextAttribute(CONNECTION_FACTORY_KEY, factory); } catch (Throwable e) { log.fatal("Can not create connection factory: "+e.getMessage(), e); } } return factory; } } 4. 如何在remote object中使用AMFContext class YouRemoteService { public void serviceMethod() { AMFContext context = AMFContext.getCurrentContext(); HttpSession = context.getSession(); ServletContext = context.getServletContext(); HttpServletRequest request = context.getRequest(); HttpServletResponse response = context.getResponse(); context.setSessionAttribute("attr","value"); context.setContextAttribute("attr","value"); } } </filter-mapping></filter-mapping></filter></filter>
分享到:
评论

相关推荐

    Flex+J2EE获取FlexSession的方法

    在探讨“Flex+J2EE获取FlexSession的方法”这一主题时,我们首先需要理解Flex与J2EE在Web开发中的角色以及如何通过它们实现会话管理。Flex是一种用于构建高度交互式的客户端应用程序的技术,而J2EE(Java 2 ...

    FLEX最强增删改查

    控制器会调用相应的服务方法,该方法利用Hibernate的Session接口创建新的实体对象并保存到数据库。 2. **删除(Delete)**:用户选择要删除的条目,Flex发送包含ID的请求到Spring的Delete接口。控制器根据ID找到...

    Myeclipse整合flex4搭建java的Web项目

    1. `&lt;listener&gt;`标签定义了一个监听器`flex.messaging.HttpFlexSession`,用于支持Flex通信的session。 2. `&lt;servlet&gt;`标签定义了名为`MessageBrokerServlet`的servlet,它是Blazeds的核心,处理与Flex客户端的通信...

    flex和hibernate的整合

    2. **服务接口定义**:在Java端,你需要定义一组服务接口,这些接口将被Hibernate的Session或者SessionFactory代理,以实现对数据库的访问。服务接口通常使用JPA(Java Persistence API)或Hibernate ORM来实现,...

    FlexWeb开发环境搭建方法

    ### FlexWeb开发环境搭建方法详解 #### 一、概述 在构建现代Web应用程序时,选择合适的开发工具和技术栈至关重要。本篇文章将详细介绍如何通过Eclipse、Flash Builder 4、BlazeDS等工具来搭建一个完整的FlexWeb...

    flex中tree的数据源是xml

    ### Flex中Tree的数据源是XML 在Flex应用开发过程中,我们常常需要用到树形结构(Tree)来展示分层数据。为了使数据呈现更加灵活且高效,通常会采用XML作为数据交换格式,这是因为XML具备良好的可读性和扩展性,...

    FLEX和spring、hibernate的集成

    `lookup`方法则负责实际的bean查找工作,通过`SpringFactoryInstance`的`lookup`方法调用Spring容器的`WebApplicationContextUtils`来获取bean。 接下来,`SpringFactoryInstance`类扩展了`FactoryInstance`,它...

    flex中的UserInfoSys源码

    用户界面的事件如按钮点击,会触发ActionScript方法,这些方法通过RemoteObject调用UserService的方法,获取或更新用户信息。 数据库层面,通常会有一个名为`userinfo`的表,包含用户名、密码、邮箱等字段。在初次...

    javaEE 与flex

    实体Bean用于持久化数据,会话Bean则处理业务逻辑,它们可以作为JavaEE服务器上的服务,供Flex客户端通过远程方法调用(Remote Method Invocation, RMI)或者Java消息服务(Java Message Service, JMS)进行通信。...

    flex平台设计说明书

    - 支持从Session中获取当前用户和访问级别信息,便于权限控制。 - 提供了方便的方法将请求参数映射到对象属性,简化了数据绑定过程。 **3.2 BaseBusiness的角色与功能** - **设计原则:** - 业务逻辑集中管理,...

    Flex 开发架构

    - **DummyAccessor.java**:定义了登录验证和获取密友列表的Java服务类。 ```java package com.ny.blog.flex.mvc.accessor; import java.util.ArrayList; import java.util.List; import ...

    flex 利用FileReference上传firefox报2038错误

    为了解决这个问题,可以借助JavaScript脚本获取正确的Cookie信息,并将其作为POST变量的一部分传递给服务器。 通过上述分析和讨论,我们可以看出在处理Flex应用中的文件上传问题时,需要综合考虑多个方面的影响因素...

    基于Flex三种通讯方式的Java配置与整合.docx

    &lt;param-name&gt;singleSession &lt;param-value&gt;true ``` #### 总结 通过上述步骤,我们已经完成了基于Flex三种通讯方式的Java配置与整合的基本流程。这种配置不仅可以提高项目的灵活性,还能增强系统的可维护性和...

    RED5调用客户端方法原代码

    这个过程通常由客户端的Flash Player或者Flex应用完成,通过创建一个NetConnection对象并调用其connect方法,传入RED5服务器的地址。 2. **注册对象**: 当连接建立后,客户端可以将对象注册到服务器上。这些对象...

    IT技术文章示例

    利用BlazeDS,Flex客户端可以订阅Java服务器上的事件,实时获取更新数据,同时也可以调用服务器端的业务逻辑方法。 ### 10. ASP.NET的线程同步问题 ASP.NET是Microsoft提供的一种Web开发框架,它使用线程池来处理...

    1+x 证书 Web 前端开发中级——理论考试(试卷8 )答案.docx

    知识点:CSS3 flex 布局的使用方法和图文效果。 10. 在 HTML5 中,hgroup 元素用于组合标题元素。 知识点:HTML5 语义化标签 hgroup 的使用方法。 11. 段落标签 &lt;p&gt; 内文本最终显示的颜色是 #666。 知识点:CSS ...

    单点登录.docx

    例如,通过`queryItemById`方法,根据商品ID获取商品信息,包括商品的基本属性和图片信息。 - 商品描述通常单独作为API提供,如`queryItemDescriptionById`,返回商品的详细描述内容。 6. **前端实现**: - 前端...

    利用Java并配置Foxmail发送邮箱(携带附件)

    在Java编程中,发送电子邮件是一项常见的任务,尤其在自动化通知、数据报告或者用户验证等场景中。本教程将深入探讨如何使用Java来配置...通过熟练掌握这些概念和方法,你可以轻松地在Java应用程序中实现邮件功能。

    《BlazeDS开发指南》.doc

    客户端编程涉及到如何使用Flex SDK提供的控件来调用服务端方法、订阅和发布消息。 总的来说,BlazeDS提供了一个强大的平台,使Flex和AIR应用能够无缝连接到Java后端,同时支持消息传递和实时通信,是构建富互联网...

    red5流媒体服务器入门基础归类.pdf

    它类似于HTTP session,并可以通过`IClientRegistry.newClient(Object[])`方法创建。 这些接口和类构成了Red5的核心,让开发者能够构建高度定制化的流媒体解决方案。通过深入理解和熟练运用这些工具,你可以创建...

Global site tag (gtag.js) - Google Analytics