flex实现session

tomcat中的session实现类是StandardSession,
其中Manager 这个接口在StandardSession中有被用到。

1.5jdk中用到了ConcurrentHashMap。
但是flex中本身是没有提供session接口的,那么该如何实现呢?参考别人的文章后总结如下:

1、在web.xml增加
Xml代码   收藏代码
  1. <filter>  
  2.    <filter-name>AMFContextFilter</filter-name>  
  3.    <filter-class>soft.flex.context.AMFContextFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.    <filter-name>AMFContextFilter</filter-name>  
  7.    <servlet-name>MessageBrokerServlet</servlet-name>  
  8. </filter-mapping>  

2、增加AMFContextFilter文件
Java代码   收藏代码
  1. package soft.flex.context;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. public class AMFContextFilter implements Filter {  
  15. public void doFilter(ServletRequest request, ServletResponse response,  
  16.     FilterChain chain) throws ServletException, IOException {  
  17.   
  18.    AMFContext.setCurrentContext((HttpServletRequest) request,  
  19.      (HttpServletResponse) response);  
  20.   
  21.    chain.doFilter(request, response);  
  22. }  
  23.   
  24. public void init(FilterConfig arg0) throws ServletException {  
  25.    // TODO Auto-generated method stub  
  26.   
  27. }  
  28.   
  29. public void destroy() {  
  30.    // TODO Auto-generated method stub  
  31.   
  32. }  
  33.   
  34. }  

3、增加AMFContext文件
Java代码   收藏代码
  1. package soft.flex.context;  
  2.   
  3. import javax.servlet.ServletContext;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6. import javax.servlet.http.HttpSession;  
  7.   
  8. public class AMFContext {  
  9.   
  10. /** 
  11. * ThreadLocal object for storing object in current thread. 
  12. */  
  13. @SuppressWarnings("unchecked")  
  14. private static ThreadLocal tl = new ThreadLocal();  
  15.   
  16. /** 
  17. * Set current context 
  18.  
  19. * @param request 
  20. *            The HttpRequest object 
  21. * @param response 
  22. *            The HttpResponses object 
  23. */  
  24. @SuppressWarnings("unchecked")  
  25. static public void setCurrentContext(HttpServletRequest request,  
  26.     HttpServletResponse response) {  
  27.    AMFContext c = getCurrentContext();  
  28.    if (c == null) {  
  29.     c = new AMFContext(request, response);  
  30.     tl.set(c);  
  31.    } else {  
  32.     c.setRequest(request);  
  33.     c.setResponse(response);  
  34.    }  
  35. }  
  36.   
  37. /** 
  38. * Get current context value 
  39.  
  40. * @return The current context 
  41. */  
  42. static public AMFContext getCurrentContext() {  
  43.    return (AMFContext) tl.get();  
  44. }  
  45.   
  46. // ----------------------------------------------------------  
  47. //  
  48. // Class members  
  49. //  
  50. // ----------------------------------------------------------  
  51.   
  52. /** 
  53. * The http request object. The lifecycle of the request object is defined 
  54. * as the request scope. It may be reused in another incoming connection, so 
  55. * dont use it in another thread. 
  56. */  
  57. private HttpServletRequest request;  
  58.   
  59. /** 
  60. * The http response object. The lifecycle of the response object is defined 
  61. * as the request scope. Dont use it in another thread. Also dont write 
  62. * output to the response when it is used in the context, but you may get or 
  63. * set some response header when it is safe. 
  64. */  
  65. private HttpServletResponse response;  
  66.   
  67. /** 
  68. * The constructor is private, to get an instance of the AMFContext, please 
  69. * use getCurrentContext() method. 
  70.  
  71. * @param request 
  72. * @param response 
  73. */  
  74. private AMFContext(HttpServletRequest request, HttpServletResponse response) {  
  75.    this.request = request;  
  76.    this.response = response;  
  77. }  
  78.   
  79. /** 
  80. * Get request object 
  81.  
  82. * @return Http request object 
  83. */  
  84. public HttpServletRequest getRequest() {  
  85.    return request;  
  86. }  
  87.   
  88. /** 
  89. * Set request object 
  90.  
  91. * @param Http 
  92. *            request object 
  93. */  
  94. public void setRequest(HttpServletRequest request) {  
  95.    this.request = request;  
  96. }  
  97.   
  98. /** 
  99. * Get response object 
  100.  
  101. * @return Http response object 
  102. */  
  103. public HttpServletResponse getResponse() {  
  104.    return response;  
  105. }  
  106.   
  107. /** 
  108. * Set response object 
  109.  
  110. * @param response 
  111. *            Http response object 
  112. */  
  113. public void setResponse(HttpServletResponse response) {  
  114.    this.response = response;  
  115. }  
  116.   
  117. /** 
  118. * Get the servlet context 
  119.  
  120. * @return 
  121. */  
  122. public ServletContext getServletContext() {  
  123.    HttpSession session = this.getSession();  
  124.    return session.getServletContext();  
  125. }  
  126.   
  127. /** 
  128. * Get the current running session 
  129.  
  130. * @return 
  131. */  
  132. public HttpSession getSession() {  
  133.    return request.getSession();  
  134. }  
  135.   
  136. /** 
  137. * Get an object stored in the session. 
  138.  
  139. * @param attr 
  140. *            Attribute Name 
  141. * @return The value stored under the attribute name. 
  142. */  
  143. public Object getSessionAttribute(String attr) {  
  144.    HttpSession session = this.getSession();  
  145.    return session.getAttribute(attr);  
  146. }  
  147.   
  148. /** 
  149. * Store an object in the session. 
  150.  
  151. * @param attr 
  152. *            Attribute Name 
  153. * @param value 
  154. *            The value. 
  155. */  
  156. public void setSessionAttribute(String attr, Object value) {  
  157.    HttpSession session = this.getSession();  
  158.    session.setAttribute(attr, value);  
  159. }  
  160.   
  161. /** 
  162. * Get an object stored in the servlet context. 
  163.  
  164. * @param attr 
  165. *            Attribute Name 
  166. * @return The value stored under the attribute name. 
  167. */  
  168. public Object getContextAttribute(String attr) {  
  169.    ServletContext sc = this.getServletContext();  
  170.    return sc.getAttribute(attr);  
  171. }  
  172.   
  173. /** 
  174. * Store an object in the servlet context. 
  175.  
  176. * @param attr 
  177. *            Attribute Name 
  178. * @param value 
  179. *            The value. 
  180. */  
  181. public void setContextAttribute(String attr, Object value) {  
  182.    ServletContext sc = this.getServletContext();  
  183.    sc.setAttribute(attr, value);  
  184. }  
  185.   
  186. /** 
  187. * Get an object stored in the current request. 
  188.  
  189. * @param attr 
  190. *            Attribute Name 
  191. * @return The value stored under the attribute name. 
  192. */  
  193. public Object getRequestAttribute(String attr) {  
  194.    return request.getAttribute(attr);  
  195. }  
  196.   
  197. /** 
  198. * Store an object in the current request. 
  199.  
  200. * @param attr 
  201. *            Attribute Name 
  202. * @param value 
  203. *            The value. 
  204. */  
  205. public void setRequestAttribute(String attr, Object value) {  
  206.    request.setAttribute(attr, value);  
  207. }  
  208.   
  209. }  

4、增加FlexSessionInterceptor文件
Java代码   收藏代码
  1. package soft.flex.context;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.aopalliance.intercept.MethodInterceptor;  
  6. import org.aopalliance.intercept.MethodInvocation;  
  7.   
  8. import soft.common.util.Constants;  
  9.   
  10. public class FlexSessionInterceptor implements MethodInterceptor {  
  11.   
  12. public Object invoke(MethodInvocation invocation) throws Throwable {  
  13.   
  14.    AMFContext context = AMFContext.getCurrentContext();  
  15.    HttpServletRequest request = context.getRequest();  
  16.    if (request.getSession().getAttribute(Constants.LOGIN_USER_INFO) == null) {  
  17.     throw new Exception("Session超时,请您重新登陆!");  
  18.    }  
  19.    return invocation.proceed();  
  20. }  
  21. }  

5、在applicationContext.xml增加以下内容
Xml代码   收藏代码
  1. <!-- 配置SessionAdvice -->  
  2. <bean id="sessionAdvice" class="soft.flex.context.FlexSessionInterceptor" />  
  3.   
  4.     <!-- 配置自动代理 -->  
  5.     <bean id="beanNameAutoProxyCreator"  
  6.     class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  7.     <property name="beanNames">  
  8.        <list>  
  9.         <value>formDesignerService</value>  
  10.        </list>  
  11.     </property>  
  12.     <property name="interceptorNames">  
  13.        <value>sessionAdvice</value>  
  14.     </property>  
  15.     </bean>  

这样子的话,在所有的flex请求中都会先执行FlexSessionInterceptor类中的invoke方法如果要在任何java类中获取sessionr的话,使用AMFContext.getCurrentContext().getSession()即可。
其实就是用ThreadLocal这个jdk1.5中的本地线程类完成的。

你可能感兴趣的:(flex实现session)