Flex中session的实现
发布时间:2020-12-15 01:26:23 所属栏目:百科 来源:网络整理
导读:tomcat中的session实现类是StandardSession, 其中Manager 这个接口在StandardSession中有被用到。 1.5jdk中用到了ConcurrentHashMap。 但是flex中本身是没有提供session接口的,那么该如何实现呢?参考别人的文章后总结如下: 1、在web.xml增加 filter filt
tomcat中的session实现类是StandardSession,
其中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文件 package soft.flex.context; 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.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AMFContextFilter implements 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 init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } public void destroy() { // TODO Auto-generated method stub } } 3、增加AMFContext文件 package soft.flex.context; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class AMFContext { /** * ThreadLocal object for storing object in current thread. */ @SuppressWarnings("unchecked") private static ThreadLocal tl = new ThreadLocal(); /** * Set current context * * @param request * The HttpRequest object * @param response * The HttpResponses object */ @SuppressWarnings("unchecked") 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); } } /** * Get current context value * * @return The current context */ static public AMFContext getCurrentContext() { return (AMFContext) tl.get(); } // ---------------------------------------------------------- // // Class members // // ---------------------------------------------------------- /** * The http request object. The lifecycle of the request object is defined * as the request scope. It may be reused in another incoming connection,so * dont use it in another thread. */ private HttpServletRequest request; /** * The http response object. The lifecycle of the response object is defined * as the request scope. Dont use it in another thread. Also dont write * output to the response when it is used in the context,but you may get or * set some response header when it is safe. */ private HttpServletResponse response; /** * The constructor is private,to get an instance of the AMFContext,please * use getCurrentContext() method. * * @param request * @param response */ private AMFContext(HttpServletRequest request,HttpServletResponse response) { this.request = request; this.response = response; } /** * Get request object * * @return Http request object */ public HttpServletRequest getRequest() { return request; } /** * Set request object * * @param Http * request object */ public void setRequest(HttpServletRequest request) { this.request = request; } /** * Get response object * * @return Http response object */ public HttpServletResponse getResponse() { return response; } /** * Set response object * * @param response * Http response object */ public void setResponse(HttpServletResponse response) { this.response = response; } /** * Get the servlet context * * @return */ public ServletContext getServletContext() { HttpSession session = this.getSession(); return session.getServletContext(); } /** * Get the current running session * * @return */ public HttpSession getSession() { return request.getSession(); } /** * Get an object stored in the session. * * @param attr * Attribute Name * @return The value stored under the attribute name. */ public Object getSessionAttribute(String attr) { HttpSession session = this.getSession(); return session.getAttribute(attr); } /** * Store an object in the session. * * @param attr * Attribute Name * @param value * The value. */ public void setSessionAttribute(String attr,Object value) { HttpSession session = this.getSession(); session.setAttribute(attr,value); } /** * Get an object stored in the servlet context. * * @param attr * Attribute Name * @return The value stored under the attribute name. */ public Object getContextAttribute(String attr) { ServletContext sc = this.getServletContext(); return sc.getAttribute(attr); } /** * Store an object in the servlet context. * * @param attr * Attribute Name * @param value * The value. */ public void setContextAttribute(String attr,Object value) { ServletContext sc = this.getServletContext(); sc.setAttribute(attr,value); } /** * Get an object stored in the current request. * * @param attr * Attribute Name * @return The value stored under the attribute name. */ public Object getRequestAttribute(String attr) { return request.getAttribute(attr); } /** * Store an object in the current request. * * @param attr * Attribute Name * @param value * The value. */ public void setRequestAttribute(String attr,Object value) { request.setAttribute(attr,value); } } 4、增加FlexSessionInterceptor文件 package soft.flex.context; import javax.servlet.http.HttpServletRequest; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import soft.common.util.Constants; public class FlexSessionInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { AMFContext context = AMFContext.getCurrentContext(); HttpServletRequest request = context.getRequest(); if (request.getSession().getAttribute(Constants.LOGIN_USER_INFO) == null) { throw new Exception("Session超时,请您重新登陆!"); } return invocation.proceed(); } } 5、在applicationContext.xml增加以下内容 <!-- 配置SessionAdvice --> <bean id="sessionAdvice" class="soft.flex.context.FlexSessionInterceptor" /> <!-- 配置自动代理 --> <bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>formDesignerService</value> </list> </property> <property name="interceptorNames"> <value>sessionAdvice</value> </property> </bean>这样子的话,在所有的flex请求中都会先执行FlexSessionInterceptor类中的invoke方法如果要在任何java类中获取sessionr的话,使用AMFContext.getCurrentContext().getSession()即可。 其实就是用ThreadLocal这个jdk1.5中的本地线程类完成的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |