<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    談笑有鴻儒,往來無白丁

    在恰當(dāng)?shù)臅r間、地點(diǎn)以恰當(dāng)?shù)姆绞奖磉_(dá)給恰當(dāng)?shù)娜?..  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強(qiáng)!向dudu站長致敬>> > 我的微博敬請收聽
    Portal開源實(shí)現(xiàn)-Liferay的Portlet Session處理(2)


    二、LIFERAY中的實(shí)現(xiàn)

    LIFERAY在構(gòu)建ActionRequestImpl和RenderRequestImpl時,會設(shè)置PORTLET SESSION,如下代碼所示:
    public RenderRequestImpl(HttpServletRequest req, Portlet portlet,
    ??????? CachePortlet cachePortlet,
    ??????? PortletContext portletCtx,
    ??????? WindowState windowState, PortletMode portletMode,
    ??????? PortletPreferences prefs, String layoutId) {
    ?? ...
    ??_req = dynamicReq;
    ??_portlet = portlet;
    ??_cachePortlet = cachePortlet;
    ??_portalCtx = new PortalContextImpl();
    ??_portletCtx = portletCtx;
    ??_windowState = windowState;
    ??_portletMode = portletMode;
    ??_prefs = prefs;
    ??_ses = new PortletSessionImpl(
    ???_req.getSession(), _portletName, _portletCtx);
    ?? ...
    ?}
    從蘭色的部分(? _ses = new PortletSessionImpl(_req.getSession(),_portletName, _portletCtx);? )我們可以看到,這個PORTLET SESSION其實(shí)就是PORTAL SYSTEM的 SESSION 對象。
    所以無論request調(diào)用getSession()或者getPortletSession()都將獲取Portal 系統(tǒng)的SESSION 對象,而無論該P(yáng)ORTLET? 是或者不是屬于PORTAL SYSTEM上下文。而且即使不同PORTAL APPLICATION的PORTLET也將使用同一個SESSION 對象(PORTAL 系統(tǒng))。
    也就是說,對于某一個PORTLET來說,如果有對其的SESSION進(jìn)行的操作,并沒有真正的在該APPLICATION上下文中的SESSION進(jìn)行操作,而是在PORTAL系統(tǒng)上下文的SESSION中進(jìn)行操作。

    而且LIFERAY提供getPortletSession來獲取PortletSession對象,而不是getSession()方法,所以即使getPortletSession()可以獲取正確的Session對象,開發(fā)人員由于習(xí)慣問題,也因使用getSession()而得不到。

    另外如果調(diào)用request.getSession(true)還可能會出現(xiàn)錯誤,因?yàn)長IFERAY在包含某一個PORTLET內(nèi)容是,調(diào)用PortletRequestDispatcherImpl.include()方法,該方法將生成PortletServletRequest 和PortletServletResponse,請見如下代碼:

    PortletServletRequest portletServletReq = new PortletServletRequest(
    ????httpReq, reqImpl, pathInfo, queryString, requestURI,
    ????servletPath);

    ???PortletServletResponse portletServletRes =
    ????new PortletServletResponse(
    ?????resImpl.getHttpServletResponse(), resImpl);
    而PortletServletRequest的構(gòu)造函數(shù)是如下定義的:
    public PortletServletRequest(HttpServletRequest req,
    ???????? RenderRequest renderRequest, String pathInfo,
    ???????? String queryString, String requestURI,
    ???????? String servletPath) {

    ??super(req);

    ??_ses = req.getSession();
    ??_renderRequest = renderRequest;
    ??_pathInfo = pathInfo;
    ??_queryString = queryString;
    ??_requestURI = requestURI;
    ??_servletPath = servletPath;
    ?}
    所以其SESSION依然是PORTAL系統(tǒng)上下文的。然后問題就出在這里,PortletServletRequest實(shí)現(xiàn)了getSession()方法,但是沒有實(shí)現(xiàn)getSession(boolen create)方法,如果用戶在此階段調(diào)用getSession(true)的話,在某些情況下就會拋出NullPointerException

    原因見如下代碼(請注意我添加的注釋部分)
    //ApplicationHttpRequest:??

    ?public HttpSession getSession(boolean create) {

    ??????? if (crossContext) {
    ???????????
    ??????????? // There cannot be a session if no context has been assigned yet
    ??????????? if (context == null)
    ??????????????? return (null);

    ??????????? // Return the current session if it exists and is valid
    ??????????? if (session != null)
    ??????????????? return (session.getSession());
    ???? // 我的注釋:這里將獲取PORTAL系統(tǒng)的SESSION對象。
    ??????????? HttpSession other = super.getSession(false);
    ??????????? if (create && (other == null)) {
    ??????????????? // First create a session in the first context: the problem is
    ??????????????? // that the top level request is the only one which can
    ??????????????? // create the cookie safely
    ??????????????? other = super.getSession(true);
    ??????????? }
    ??????????? if (other != null) {
    ??????????????? Session localSession = null;
    ??????????????? try {
    ??????????????????? // 我的注釋:this context did not have the session with session id. It can just be found in the Portal
    ??????????????????? // context. So here it will return a null value.
    ??????????????????? localSession =
    ??????????????????????? context.getManager().findSession(other.getId());
    ??????????????????? localSession.access(); //我的注釋:Here, localSession is null. So it throws a NullPointException.
    ??????????????? } catch (IOException e) {
    ??????????????????? // Ignore
    ??????????????? }
    ??????????????? if (localSession == null) {
    ??????????????????? localSession = context.getManager().createEmptySession();
    ??????????????????? localSession.setNew(true);
    ??????????????????? localSession.setValid(true);
    ??????????????????? localSession.setCreationTime(System.currentTimeMillis());
    ??????????????????? localSession.setMaxInactiveInterval
    ??????????????????????? (context.getManager().getMaxInactiveInterval());

    posted on 2006-07-31 10:09 壞男孩 閱讀(1124) 評論(0)  編輯  收藏 所屬分類: Portal相關(guān)文檔

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲乱色伦图片区小说| 亚洲小视频在线播放| 国产精品玖玖美女张开腿让男人桶爽免费看| 成人免费视频国产| 亚洲国产免费综合| 亚洲另类无码专区首页| 亚洲免费视频在线观看| 成人免费视频软件网站| 一级特黄色毛片免费看| 亚洲福利一区二区精品秒拍| 日韩视频免费一区二区三区| 1a级毛片免费观看| 日韩精品无码免费视频| 久久亚洲精品无码AV红樱桃| 免费黄色小视频网站| a级毛片免费高清毛片视频| 亚洲国产中文在线二区三区免| 免费无遮挡无码永久在线观看视频| 最新亚洲人成网站在线观看| 亚洲精品无码久久久久去q| 一二三四免费观看在线视频中文版 | 久久久青草青青国产亚洲免观 | 国产精品免费视频网站| 成人无码WWW免费视频| 亚洲综合偷自成人网第页色| 自拍偷自拍亚洲精品第1页| 中文字幕人成无码免费视频| 18观看免费永久视频| 日本免费一区二区三区| 成人午夜免费视频| 国产亚洲精品VA片在线播放| 国产成人精品日本亚洲网站| 国产在线观看www鲁啊鲁免费| 国外成人免费高清激情视频| 99在线免费观看视频| 99久久精品免费精品国产| 久久精品无码专区免费青青| 国产精品无码永久免费888| 亚洲免费日韩无码系列| 国产精品美女久久久免费 | 亚洲色欲色欲www在线丝|