tomcat中的session实现类是StandardSession,
其中Manager 这个接口在StandardSession中有被用到。
1.5jdk中用到了ConcurrentHashMap。
但是flex中本身是没有提供session接口的,那么该如何实现呢?参考别人的文章后总结如下:
1、在web.xml增加
2、增加AMFContextFilter文件
3、增加AMFContext文件
4、增加FlexSessionInterceptor文件
5、在applicationContext.xml增加以下内容
这样子的话,在所有的flex请求中都会先执行FlexSessionInterceptor类中的invoke方法如果要在任何java类中获取sessionr的话,使用AMFContext.getCurrentContext().getSession()即可。
其实就是用ThreadLocal这个jdk1.5中的本地线程类完成的。
其中Manager 这个接口在StandardSession中有被用到。
1.5jdk中用到了ConcurrentHashMap。
但是flex中本身是没有提供session接口的,那么该如何实现呢?参考别人的文章后总结如下:
1、在web.xml增加
- <filter>
- <filter-name>AMFContextFilter</filter-name>
- <filter-class>soft.flex.context.AMFContextFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>AMFContextFilter</filter-name>
- <servlet-name>MessageBrokerServlet</servlet-name>
- </filter-mapping>
2、增加AMFContextFilter文件
- packagesoft.flex.context;
- importjava.io.IOException;
- importjavax.servlet.Filter;
- importjavax.servlet.FilterChain;
- importjavax.servlet.FilterConfig;
- importjavax.servlet.ServletException;
- importjavax.servlet.ServletRequest;
- importjavax.servlet.ServletResponse;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- publicclassAMFContextFilterimplementsFilter{
- publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
- FilterChainchain)throwsServletException,IOException{
- AMFContext.setCurrentContext((HttpServletRequest)request,
- (HttpServletResponse)response);
- chain.doFilter(request,response);
- }
- publicvoidinit(FilterConfigarg0)throwsServletException{
- //TODOAuto-generatedmethodstub
- }
- publicvoiddestroy(){
- //TODOAuto-generatedmethodstub
- }
- }
3、增加AMFContext文件
- packagesoft.flex.context;
- importjavax.servlet.ServletContext;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importjavax.servlet.http.HttpSession;
- publicclassAMFContext{
- /**
- *ThreadLocalobjectforstoringobjectincurrentthread.
- */
- @SuppressWarnings("unchecked")
- privatestaticThreadLocaltl=newThreadLocal();
- /**
- *Setcurrentcontext
- *
- *@paramrequest
- *TheHttpRequestobject
- *@paramresponse
- *TheHttpResponsesobject
- */
- @SuppressWarnings("unchecked")
- staticpublicvoidsetCurrentContext(HttpServletRequestrequest,
- HttpServletResponseresponse){
- AMFContextc=getCurrentContext();
- if(c==null){
- c=newAMFContext(request,response);
- tl.set(c);
- }else{
- c.setRequest(request);
- c.setResponse(response);
- }
- }
- /**
- *Getcurrentcontextvalue
- *
- *@returnThecurrentcontext
- */
- staticpublicAMFContextgetCurrentContext(){
- return(AMFContext)tl.get();
- }
- //----------------------------------------------------------
- //
- //Classmembers
- //
- //----------------------------------------------------------
- /**
- *Thehttprequestobject.Thelifecycleoftherequestobjectisdefined
- *astherequestscope.Itmaybereusedinanotherincomingconnection,so
- *dontuseitinanotherthread.
- */
- privateHttpServletRequestrequest;
- /**
- *Thehttpresponseobject.Thelifecycleoftheresponseobjectisdefined
- *astherequestscope.Dontuseitinanotherthread.Alsodontwrite
- *outputtotheresponsewhenitisusedinthecontext,butyoumaygetor
- *setsomeresponseheaderwhenitissafe.
- */
- privateHttpServletResponseresponse;
- /**
- *Theconstructorisprivate,togetaninstanceoftheAMFContext,please
- *usegetCurrentContext()method.
- *
- *@paramrequest
- *@paramresponse
- */
- privateAMFContext(HttpServletRequestrequest,HttpServletResponseresponse){
- this.request=request;
- this.response=response;
- }
- /**
- *Getrequestobject
- *
- *@returnHttprequestobject
- */
- publicHttpServletRequestgetRequest(){
- returnrequest;
- }
- /**
- *Setrequestobject
- *
- *@paramHttp
- *requestobject
- */
- publicvoidsetRequest(HttpServletRequestrequest){
- this.request=request;
- }
- /**
- *Getresponseobject
- *
- *@returnHttpresponseobject
- */
- publicHttpServletResponsegetResponse(){
- returnresponse;
- }
- /**
- *Setresponseobject
- *
- *@paramresponse
- *Httpresponseobject
- */
- publicvoidsetResponse(HttpServletResponseresponse){
- this.response=response;
- }
- /**
- *Gettheservletcontext
- *
- *@return
- */
- publicServletContextgetServletContext(){
- HttpSessionsession=this.getSession();
- returnsession.getServletContext();
- }
- /**
- *Getthecurrentrunningsession
- *
- *@return
- */
- publicHttpSessiongetSession(){
- returnrequest.getSession();
- }
- /**
- *Getanobjectstoredinthesession.
- *
- *@paramattr
- *AttributeName
- *@returnThevaluestoredundertheattributename.
- */
- publicObjectgetSessionAttribute(Stringattr){
- HttpSessionsession=this.getSession();
- returnsession.getAttribute(attr);
- }
- /**
- *Storeanobjectinthesession.
- *
- *@paramattr
- *AttributeName
- *@paramvalue
- *Thevalue.
- */
- publicvoidsetSessionAttribute(Stringattr,Objectvalue){
- HttpSessionsession=this.getSession();
- session.setAttribute(attr,value);
- }
- /**
- *Getanobjectstoredintheservletcontext.
- *
- *@paramattr
- *AttributeName
- *@returnThevaluestoredundertheattributename.
- */
- publicObjectgetContextAttribute(Stringattr){
- ServletContextsc=this.getServletContext();
- returnsc.getAttribute(attr);
- }
- /**
- *Storeanobjectintheservletcontext.
- *
- *@paramattr
- *AttributeName
- *@paramvalue
- *Thevalue.
- */
- publicvoidsetContextAttribute(Stringattr,Objectvalue){
- ServletContextsc=this.getServletContext();
- sc.setAttribute(attr,value);
- }
- /**
- *Getanobjectstoredinthecurrentrequest.
- *
- *@paramattr
- *AttributeName
- *@returnThevaluestoredundertheattributename.
- */
- publicObjectgetRequestAttribute(Stringattr){
- returnrequest.getAttribute(attr);
- }
- /**
- *Storeanobjectinthecurrentrequest.
- *
- *@paramattr
- *AttributeName
- *@paramvalue
- *Thevalue.
- */
- publicvoidsetRequestAttribute(Stringattr,Objectvalue){
- request.setAttribute(attr,value);
- }
- }
4、增加FlexSessionInterceptor文件
- packagesoft.flex.context;
- importjavax.servlet.http.HttpServletRequest;
- importorg.aopalliance.intercept.MethodInterceptor;
- importorg.aopalliance.intercept.MethodInvocation;
- importsoft.common.util.Constants;
- publicclassFlexSessionInterceptorimplementsMethodInterceptor{
- publicObjectinvoke(MethodInvocationinvocation)throwsThrowable{
- AMFContextcontext=AMFContext.getCurrentContext();
- HttpServletRequestrequest=context.getRequest();
- if(request.getSession().getAttribute(Constants.LOGIN_USER_INFO)==null){
- thrownewException("Session超时,请您重新登陆!");
- }
- returninvocation.proceed();
- }
- }
5、在applicationContext.xml增加以下内容
- <!--配置SessionAdvice-->
- <beanid="sessionAdvice"class="soft.flex.context.FlexSessionInterceptor"/>
- <!--配置自动代理-->
- <beanid="beanNameAutoProxyCreator"
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <propertyname="beanNames">
- <list>
- <value>formDesignerService</value>
- </list>
- </property>
- <propertyname="interceptorNames">
- <value>sessionAdvice</value>
- </property>
- </bean>
这样子的话,在所有的flex请求中都会先执行FlexSessionInterceptor类中的invoke方法如果要在任何java类中获取sessionr的话,使用AMFContext.getCurrentContext().getSession()即可。
其实就是用ThreadLocal这个jdk1.5中的本地线程类完成的。