首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

Flex获得session的步骤

2013-12-11 
Flex获得session的方法1. 使用Blazeds与JAVA后台通信的可以通过以下方案获取Session中的信息FlexContext.g

Flex获得session的方法
1. 使用Blazeds与JAVA后台通信的可以通过以下方案获取Session中的信息FlexContext.getFlexSession().getAttribute(att);2. Flex Remote Object中直接使用HttpSession的方法问题的背景Flex Remote Object可以是POJO,JavaBean或是EJB。在面向服务的架构中(ServiceOriented Architecture),我们可以用Remote Object来作为Service Facade,利用应用服务器提供的persistent service来储存状态信息。Flex既可以提供stateful或stateless的remote object, 另外还有session servlet让mxml获取/和储存session中的内容。这一切听上去都很完美,但是有一个问题,Flex RemoteObject本身是无法获得任何有关Running Context的信息,也就是说,你无法从你的 RemoteObject 中获得HttpSession, HttpRequest 和 ServletContext。 所谓的 Flex Session servlet只是让MXML获得session的内容,而不是直接让Remote Object获得session。Remote Object为什么需要获得HttpRequest, HttpSession?既然Flex提供了stateful的remote object为什么还要让remote object获得RunningContext呢?问题在于Flex中的stateful是基于应用服务器的http session,而且你无法控制AMFGateway建立remoteobject的过程。打个简单的比方,我们知道一般的应用服务器中,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 isok.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中使用AMFContextclass 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>

热点排行