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在Web开发中的角色以及如何通过它们实现会话管理。Flex是一种用于构建高度交互式的客户端应用程序的技术,而J2EE(Java 2 ...
控制器会调用相应的服务方法,该方法利用Hibernate的Session接口创建新的实体对象并保存到数据库。 2. **删除(Delete)**:用户选择要删除的条目,Flex发送包含ID的请求到Spring的Delete接口。控制器根据ID找到...
1. `<listener>`标签定义了一个监听器`flex.messaging.HttpFlexSession`,用于支持Flex通信的session。 2. `<servlet>`标签定义了名为`MessageBrokerServlet`的servlet,它是Blazeds的核心,处理与Flex客户端的通信...
2. **服务接口定义**:在Java端,你需要定义一组服务接口,这些接口将被Hibernate的Session或者SessionFactory代理,以实现对数据库的访问。服务接口通常使用JPA(Java Persistence API)或Hibernate ORM来实现,...
### FlexWeb开发环境搭建方法详解 #### 一、概述 在构建现代Web应用程序时,选择合适的开发工具和技术栈至关重要。本篇文章将详细介绍如何通过Eclipse、Flash Builder 4、BlazeDS等工具来搭建一个完整的FlexWeb...
### Flex中Tree的数据源是XML 在Flex应用开发过程中,我们常常需要用到树形结构(Tree)来展示分层数据。为了使数据呈现更加灵活且高效,通常会采用XML作为数据交换格式,这是因为XML具备良好的可读性和扩展性,...
`lookup`方法则负责实际的bean查找工作,通过`SpringFactoryInstance`的`lookup`方法调用Spring容器的`WebApplicationContextUtils`来获取bean。 接下来,`SpringFactoryInstance`类扩展了`FactoryInstance`,它...
用户界面的事件如按钮点击,会触发ActionScript方法,这些方法通过RemoteObject调用UserService的方法,获取或更新用户信息。 数据库层面,通常会有一个名为`userinfo`的表,包含用户名、密码、邮箱等字段。在初次...
实体Bean用于持久化数据,会话Bean则处理业务逻辑,它们可以作为JavaEE服务器上的服务,供Flex客户端通过远程方法调用(Remote Method Invocation, RMI)或者Java消息服务(Java Message Service, JMS)进行通信。...
- 支持从Session中获取当前用户和访问级别信息,便于权限控制。 - 提供了方便的方法将请求参数映射到对象属性,简化了数据绑定过程。 **3.2 BaseBusiness的角色与功能** - **设计原则:** - 业务逻辑集中管理,...
- **DummyAccessor.java**:定义了登录验证和获取密友列表的Java服务类。 ```java package com.ny.blog.flex.mvc.accessor; import java.util.ArrayList; import java.util.List; import ...
为了解决这个问题,可以借助JavaScript脚本获取正确的Cookie信息,并将其作为POST变量的一部分传递给服务器。 通过上述分析和讨论,我们可以看出在处理Flex应用中的文件上传问题时,需要综合考虑多个方面的影响因素...
<param-name>singleSession <param-value>true ``` #### 总结 通过上述步骤,我们已经完成了基于Flex三种通讯方式的Java配置与整合的基本流程。这种配置不仅可以提高项目的灵活性,还能增强系统的可维护性和...
这个过程通常由客户端的Flash Player或者Flex应用完成,通过创建一个NetConnection对象并调用其connect方法,传入RED5服务器的地址。 2. **注册对象**: 当连接建立后,客户端可以将对象注册到服务器上。这些对象...
利用BlazeDS,Flex客户端可以订阅Java服务器上的事件,实时获取更新数据,同时也可以调用服务器端的业务逻辑方法。 ### 10. ASP.NET的线程同步问题 ASP.NET是Microsoft提供的一种Web开发框架,它使用线程池来处理...
知识点:CSS3 flex 布局的使用方法和图文效果。 10. 在 HTML5 中,hgroup 元素用于组合标题元素。 知识点:HTML5 语义化标签 hgroup 的使用方法。 11. 段落标签 <p> 内文本最终显示的颜色是 #666。 知识点:CSS ...
例如,通过`queryItemById`方法,根据商品ID获取商品信息,包括商品的基本属性和图片信息。 - 商品描述通常单独作为API提供,如`queryItemDescriptionById`,返回商品的详细描述内容。 6. **前端实现**: - 前端...
在Java编程中,发送电子邮件是一项常见的任务,尤其在自动化通知、数据报告或者用户验证等场景中。本教程将深入探讨如何使用Java来配置...通过熟练掌握这些概念和方法,你可以轻松地在Java应用程序中实现邮件功能。
客户端编程涉及到如何使用Flex SDK提供的控件来调用服务端方法、订阅和发布消息。 总的来说,BlazeDS提供了一个强大的平台,使Flex和AIR应用能够无缝连接到Java后端,同时支持消息传递和实时通信,是构建富互联网...
它类似于HTTP session,并可以通过`IClientRegistry.newClient(Object[])`方法创建。 这些接口和类构成了Red5的核心,让开发者能够构建高度定制化的流媒体解决方案。通过深入理解和熟练运用这些工具,你可以创建...