怎么获取httpsession对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么获取httpsession对象相关的知识,希望对你有一定的参考价值。

1、Shiro默认的Session处理方式这里从DefaultWebSecurityManager这里看起,这个代码是定义的Shiro安全管理对象,看下面的构造方法(代码1-1)(代码1-1)publicDefaultWebSecurityManager()super();((DefaultSubjectDAO)this.subjectDAO).setSessionStorageEvaluator(newDefaultWebSessionStorageEvaluator());this.sessionMode=HTTP_SESSION_MODE;setSubjectFactory(newDefaultWebSubjectFactory());setRememberMeManager(newCookieRememberMeManager());setSessionManager(newServletContainerSessionManager());从构造方法里面可以看出,这里面有publicvoidsetRememberMeManager(RememberMeManagerrememberMeManager)和publicvoidsetSessionManager(SessionManagersessionManager)两个方法。这两个分别是对Shiro的remembereMe功能和Session功能的管理。其中在构造方法里面可以看到,其实一开是就设置了SessionManager,就是默认的:ServletContainerSessionManager().接下来看看默认的ServletContainerSessionManager()是怎么玩转Session的.看下图。这个图显示了这个类的这些个方法这个类通过getSession(SessionKey)获得Sesison,下面看看这个方法干了些什么(代码1-2)(代码1-2)publicSessiongetSession(SessionKeykey)throwsSessionExceptionif(!WebUtils.isHttp(key))//判断是不是http的key,否则抛异常Stringmsg="SessionKeymustbeanHTTPcompatibleimplementation.";thrownewIllegalArgumentException(msg);HttpServletRequestrequest=WebUtils.getHttpRequest(key);//通过工具类获得HttpServletRequest这类是javax.servlet.http.HttpServletRequest;Sessionsession=null;HttpSessionhttpSession=request.getSession(false);//先从request里获得本来存在的if(httpSession!=null)session=createSession(httpSession,request.getRemoteHost());//如果不为空,就创建一个封装了的,为空就不管它returnsession;可以看看注释,注释上都写好了,这里的意思是,首先判断封装好的Key是不是Http的key,如果是就继续,不是就抛异常.key这个是带了ServletRequest和ServletResponse的WebSessinKey,具体怎么new出来的,看DefaultWebSecurityManager的这方法代码就知道了(代码1-3),这里里,将Request和Response还有sessionId传递进去(代码1-3)@OverrideprotectedSessionKeygetSessionKey(SubjectContextcontext)if(WebUtils.isWeb(context))SerializablesessionId=context.getSessionId();ServletRequestrequest=WebUtils.getRequest(context);ServletResponseresponse=WebUtils.getResponse(context);returnnewWebSessionKey(sessionId,request,response);elsereturnsuper.getSessionKey(context);因为继承了org.apache.shiro.session.mgt.DefaultSessionKey,这个类是实现了SessionKey这个接口。看看createSession这个方法,这个方法就是将传入的HttpSession和host传进去,封装成Shiro的HttpServletSession(代码1-4)(代码1-4)protectedSessioncreateSession(HttpSessionhttpSession,Stringhost)returnnewHttpServletSession(httpSession,host);关于默认的Session管理器,最后还看一下HttpServletSession这个类,就看一下的几个方法,还有些方法是没有放出来的,可以明显的看出,Shiro使用了一个叫Session的接口,但这个接口是和HttpSession的接口一模一样,就是通过HttpSession这个接口获得Session的功能(代码1-5)(代码1-5)publicclassHttpServletSessionimplementsSessionprivateHttpSessionhttpSession=null;publicHttpServletSession(HttpSessionhttpSession,Stringhost)if(httpSession==null)Stringmsg="HttpSessionconstructorargumentcannotbenull.";thrownewIllegalArgumentException(msg);if(httpSessioninstanceofShiroHttpSession)Stringmsg="HttpSessionconstructorargumentcannotbeaninstanceofShiroHttpSession.This"+"isenforcedtopreventcirculardependenciesandinfiniteloops.";thrownewIllegalArgumentException(msg);this.httpSession=httpSession;if(StringUtils.hasText(host))setHost(host);…………………………………………………………publicObjectgetAttribute(Objectkey)throwsInvalidSessionExceptiontryreturnhttpSession.getAttribute(assertString(key));catch(Exceptione)thrownewInvalidSessionException(e);publicvoidsetAttribute(Objectkey,Objectvalue)throwsInvalidSessionExceptiontryhttpSession.setAttribute(assertString(key),value);catch(Exceptione)thrownewInvalidSessionException(e);………………………………默认的模式就描述到这里 参考技术A HttpSessionEvent.getSession().getServletContext();

以上是关于怎么获取httpsession对象的主要内容,如果未能解决你的问题,请参考以下文章

Security 获取当前会话的三种方法

Security 获取当前会话的三种方法

怎么获取httpsession对象

如何获取 Web 应用程序中所有 HttpSession 对象的列表?

HttpSession相关API

SpringMvc 整合Freemarker后,ftl页面怎么获取httpSession