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编译优化方法,以及Flex工程编译慢的优化方案
Flex获取设置html cookie;Flex获取设置html cookie
去除flex builder试用版水印 去除flex chart 水印方法
flex中获取截屏方法 html文档说明 第一次上传,学习学习
flex调用java方法.pdf
介绍 Flex 项目 国际化的 具体方法
flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图...
Flex3.5以上版本,均可使用。采用遮罩方法对图片进行裁剪。
FLEX特效FLEX特效FLEX特效FLEX特效 FLEX特效FLEX特效FLEX特效FLEX特效 FLEX特效FLEX特效FLEX特效FLEX特效 FLEX特效FLEX特效FLEX特效FLEX特效
Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex ...
Flex简介Flex简介Flex简介Flex简介Flex简介
flex事件flex事件flex事件flex事件flex事件
flex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex学习的好资源啊
Flex 组件Flex 组件Flex 组件Flex 组件Flex 组件
Flex中加载SWF方法,介绍了flex 对 swf 加载和处理
flex获得html容器传递的url参数值
java flexjava flexjava flex
Flex连接数据库的方法Flex连接数据库的方法Flex连接数据库的方法Flex连接数据库的方法Flex连接数据库的方法
amfphp和flex通讯的例子,一个及时聊天的例子,适合学习amfphp的朋友和网络开发的朋友学习