`
hyshucom
  • 浏览: 808415 次
文章分类
社区版块
存档分类
最新评论

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. packagesoft.flex.context;
  2. importjava.io.IOException;
  3. importjavax.servlet.Filter;
  4. importjavax.servlet.FilterChain;
  5. importjavax.servlet.FilterConfig;
  6. importjavax.servlet.ServletException;
  7. importjavax.servlet.ServletRequest;
  8. importjavax.servlet.ServletResponse;
  9. importjavax.servlet.http.HttpServletRequest;
  10. importjavax.servlet.http.HttpServletResponse;
  11. publicclassAMFContextFilterimplementsFilter{
  12. publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
  13. FilterChainchain)throwsServletException,IOException{
  14. AMFContext.setCurrentContext((HttpServletRequest)request,
  15. (HttpServletResponse)response);
  16. chain.doFilter(request,response);
  17. }
  18. publicvoidinit(FilterConfigarg0)throwsServletException{
  19. //TODOAuto-generatedmethodstub
  20. }
  21. publicvoiddestroy(){
  22. //TODOAuto-generatedmethodstub
  23. }
  24. }

3、增加AMFContext文件
Java代码 收藏代码
  1. packagesoft.flex.context;
  2. importjavax.servlet.ServletContext;
  3. importjavax.servlet.http.HttpServletRequest;
  4. importjavax.servlet.http.HttpServletResponse;
  5. importjavax.servlet.http.HttpSession;
  6. publicclassAMFContext{
  7. /**
  8. *ThreadLocalobjectforstoringobjectincurrentthread.
  9. */
  10. @SuppressWarnings("unchecked")
  11. privatestaticThreadLocaltl=newThreadLocal();
  12. /**
  13. *Setcurrentcontext
  14. *
  15. *@paramrequest
  16. *TheHttpRequestobject
  17. *@paramresponse
  18. *TheHttpResponsesobject
  19. */
  20. @SuppressWarnings("unchecked")
  21. staticpublicvoidsetCurrentContext(HttpServletRequestrequest,
  22. HttpServletResponseresponse){
  23. AMFContextc=getCurrentContext();
  24. if(c==null){
  25. c=newAMFContext(request,response);
  26. tl.set(c);
  27. }else{
  28. c.setRequest(request);
  29. c.setResponse(response);
  30. }
  31. }
  32. /**
  33. *Getcurrentcontextvalue
  34. *
  35. *@returnThecurrentcontext
  36. */
  37. staticpublicAMFContextgetCurrentContext(){
  38. return(AMFContext)tl.get();
  39. }
  40. //----------------------------------------------------------
  41. //
  42. //Classmembers
  43. //
  44. //----------------------------------------------------------
  45. /**
  46. *Thehttprequestobject.Thelifecycleoftherequestobjectisdefined
  47. *astherequestscope.Itmaybereusedinanotherincomingconnection,so
  48. *dontuseitinanotherthread.
  49. */
  50. privateHttpServletRequestrequest;
  51. /**
  52. *Thehttpresponseobject.Thelifecycleoftheresponseobjectisdefined
  53. *astherequestscope.Dontuseitinanotherthread.Alsodontwrite
  54. *outputtotheresponsewhenitisusedinthecontext,butyoumaygetor
  55. *setsomeresponseheaderwhenitissafe.
  56. */
  57. privateHttpServletResponseresponse;
  58. /**
  59. *Theconstructorisprivate,togetaninstanceoftheAMFContext,please
  60. *usegetCurrentContext()method.
  61. *
  62. *@paramrequest
  63. *@paramresponse
  64. */
  65. privateAMFContext(HttpServletRequestrequest,HttpServletResponseresponse){
  66. this.request=request;
  67. this.response=response;
  68. }
  69. /**
  70. *Getrequestobject
  71. *
  72. *@returnHttprequestobject
  73. */
  74. publicHttpServletRequestgetRequest(){
  75. returnrequest;
  76. }
  77. /**
  78. *Setrequestobject
  79. *
  80. *@paramHttp
  81. *requestobject
  82. */
  83. publicvoidsetRequest(HttpServletRequestrequest){
  84. this.request=request;
  85. }
  86. /**
  87. *Getresponseobject
  88. *
  89. *@returnHttpresponseobject
  90. */
  91. publicHttpServletResponsegetResponse(){
  92. returnresponse;
  93. }
  94. /**
  95. *Setresponseobject
  96. *
  97. *@paramresponse
  98. *Httpresponseobject
  99. */
  100. publicvoidsetResponse(HttpServletResponseresponse){
  101. this.response=response;
  102. }
  103. /**
  104. *Gettheservletcontext
  105. *
  106. *@return
  107. */
  108. publicServletContextgetServletContext(){
  109. HttpSessionsession=this.getSession();
  110. returnsession.getServletContext();
  111. }
  112. /**
  113. *Getthecurrentrunningsession
  114. *
  115. *@return
  116. */
  117. publicHttpSessiongetSession(){
  118. returnrequest.getSession();
  119. }
  120. /**
  121. *Getanobjectstoredinthesession.
  122. *
  123. *@paramattr
  124. *AttributeName
  125. *@returnThevaluestoredundertheattributename.
  126. */
  127. publicObjectgetSessionAttribute(Stringattr){
  128. HttpSessionsession=this.getSession();
  129. returnsession.getAttribute(attr);
  130. }
  131. /**
  132. *Storeanobjectinthesession.
  133. *
  134. *@paramattr
  135. *AttributeName
  136. *@paramvalue
  137. *Thevalue.
  138. */
  139. publicvoidsetSessionAttribute(Stringattr,Objectvalue){
  140. HttpSessionsession=this.getSession();
  141. session.setAttribute(attr,value);
  142. }
  143. /**
  144. *Getanobjectstoredintheservletcontext.
  145. *
  146. *@paramattr
  147. *AttributeName
  148. *@returnThevaluestoredundertheattributename.
  149. */
  150. publicObjectgetContextAttribute(Stringattr){
  151. ServletContextsc=this.getServletContext();
  152. returnsc.getAttribute(attr);
  153. }
  154. /**
  155. *Storeanobjectintheservletcontext.
  156. *
  157. *@paramattr
  158. *AttributeName
  159. *@paramvalue
  160. *Thevalue.
  161. */
  162. publicvoidsetContextAttribute(Stringattr,Objectvalue){
  163. ServletContextsc=this.getServletContext();
  164. sc.setAttribute(attr,value);
  165. }
  166. /**
  167. *Getanobjectstoredinthecurrentrequest.
  168. *
  169. *@paramattr
  170. *AttributeName
  171. *@returnThevaluestoredundertheattributename.
  172. */
  173. publicObjectgetRequestAttribute(Stringattr){
  174. returnrequest.getAttribute(attr);
  175. }
  176. /**
  177. *Storeanobjectinthecurrentrequest.
  178. *
  179. *@paramattr
  180. *AttributeName
  181. *@paramvalue
  182. *Thevalue.
  183. */
  184. publicvoidsetRequestAttribute(Stringattr,Objectvalue){
  185. request.setAttribute(attr,value);
  186. }
  187. }

4、增加FlexSessionInterceptor文件
Java代码 收藏代码
  1. packagesoft.flex.context;
  2. importjavax.servlet.http.HttpServletRequest;
  3. importorg.aopalliance.intercept.MethodInterceptor;
  4. importorg.aopalliance.intercept.MethodInvocation;
  5. importsoft.common.util.Constants;
  6. publicclassFlexSessionInterceptorimplementsMethodInterceptor{
  7. publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{
  8. AMFContextcontext=AMFContext.getCurrentContext();
  9. HttpServletRequestrequest=context.getRequest();
  10. if(request.getSession().getAttribute(Constants.LOGIN_USER_INFO)==null){
  11. thrownewException("Session超时,请您重新登陆!");
  12. }
  13. returninvocation.proceed();
  14. }
  15. }

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

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

分享到:
评论
3 楼 flywing521 2013-04-15  
为什么配置 web.xml 时报错?
2 楼 宅男贰号 2013-02-19  
iteye我不常上,回复时请发件通知一下,wooh@163.com
1 楼 宅男贰号 2013-02-19  
ThreadLocal不是线程,可以理解为它是线程变量,你的例子我觉得是错的。


比如用户在自己的电脑上通过Flex请求两次,你觉得这两次请求是共用的同一个Session吗?

相关推荐

Global site tag (gtag.js) - Google Analytics