2013-05-30 79 views
0

我想從JavaScript代碼(檢查用戶會話是否仍然活動)進行ajax調用。我希望我的代碼獨立於任何portlet,因此想要在javascript中構建url,而不必依賴portlet id。liferay是否可以獨立於portlet進行ajax調用?

這可能在MVCPortlet框架內嗎?如果沒有,是否有其他選擇?

在此行下面編輯。

我知道liferay的會話管理機制,實際上我已經設置了會話的自動擴展。但是,我的兩個用戶失去了長時間的輸入,因爲儘管有這種機制,但會話過期了(我相信他們中斷了他們的工作,而他們的電腦卻睡着了......)。

我想通過檢查某個會話是否仍處於活動狀態,然後從某些表單提交輸入之前避免出現這種情況。我這樣做的方式是預先提交一個ajax調用,我將在下面詳細介紹。

我的真正問題是:如何在該代碼中刪除對portletId的依賴,以便我不需要更改要在其中實現此機制的每個Portlet。

我今天就用下面的JavaScript函數:

Liferay.provide(window, "bb_checkSession", 
    function (sessionId, portletId, successCallback, failureCallback) { 
     var A = AUI(); 
     var resourceUrl = Liferay.PortletURL.createResourceURL(); 
     resourceUrl.setResourceId("CHECK_SESSION"); 
     resourceUrl.setPortletId(portletId); 
     A.io.request(resourceUrl.toString(), { 
      method: 'GET', 
      cache: false, 
      on: { 
       success: function() { 
        var responseData = A.JSON.parse(this.get('responseData')); 
        if (responseData == null || sessionId != responseData.sessionId) { 
         if (failureCallback) failureCallback(); 
        } else { 
         if (successCallback) successCallback(); 
        } 
       }, 
       failure: function() { 
        if (failureCallback) failureCallback(); 
       } 
      } 
     }); 
    }, 
    ['aui-io', 'liferay-portlet-url'] 
); 

,並在我的portlet中,我處理呼叫如下

public void checkSession(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException { 

    PortletSession session = resourceRequest.getPortletSession(); 

    JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); 
    resourceResponse.setContentType("text/javascript"); 
    jsonObject.put("sessionId", session.getId()); 
    resourceResponse.getWriter().write(jsonObject.toString()); 
} 
+0

謝謝Vikas,Olaf,您的快速反應是有用的,但並不真正解決我的問題。我正在編輯我的帖子以澄清。 –

回答

-1

這可以通過Jquery可以輕鬆實現。如果在您的web.xml中,您已將session-timeout定義爲15分鐘,則在第14分鐘時將出現一個燈箱,它將詢問用戶是否希望繼續會話或註銷。

如果用戶希望繼續會話,則調用/c/portal/extend_session(Ajax),否則調用/c/portal/logout

下面的代碼獨立於任何類型的portlet。您需要將此代碼放置在JSP/Facelets頁面中。

<script src="/static-files/scripts/jquery-1.6.2.js" type="text/javascript" charset="utf-8"></script> 
<script src="/static-files/scripts/jquery-ui.min.js" type="text/javascript" charset="utf-8"></script> 
<script src="/static-files/scripts/jquery.idletimer.js" type="text/javascript" charset="utf-8"></script> 
<script src="/static-files/scripts/jquery.idletimeout.js" type="text/javascript" charset="utf-8"></script> 
<link href="/static-files/css/jquery-ui-rev.css" type="text/css" rel="stylesheet"/> 

<script type="text/javascript" charset="utf-8"> 
var $j=jQuery.noConflict(); 
$j(document).ready(function() 
     { 

    $j("#dialog").attr("style","visibility:visible"); 
    var titletext=$j(this).attr('title'); 
    $j("#dialog").bind("contextmenu",function(event) 
      { return false; }) 

// setup the dialog 
$j("#dialog").dialog({ 
    autoOpen: false, 
    modal: true, 
    width: 400, 
    height: 200, 
    closeOnEscape: false, 
    draggable: false, 
    resizable: false, 
    buttons: { 
    'Yes, Continue': function() 
    { 

     $j.ajax({ 
       url: '/c/portal/extend_session', 
       cache: false, 
       success: function() { 
       $j('div#dialog').dialog('close'); 
       } 
      }); 

     $j(document).attr('title',titletext); 
     }, 
     'No, Log out': function(){ 

      $j.idleTimeout.options.onTimeout.call($j.post('/c/portal/logout',function() 
       {})) 
     } 
    } 

}); 

// cache a reference to the countdown element so we don't have to query the DOM for it on each ping. 
var $jcountdown = $j("#dialog-countdown"); 

// start the idle timer plugint 
$j.idleTimeout('#dialog', 'div.ui-dialog-buttonpane button:first', { 
    idleAfter: 840, // 14 mins 

    onTimeout: function(){ 
     window.location.replace("/c/portal/logout"); 
    }, 
    onIdle: function(){ 
     $j(document).attr('title', 'Warning! Due to inactivity, your session is about to expire.'); 
     $j(this).dialog("open"); 


    }, 
    onCountdown: function(counter){ 
     $jcountdown.html(counter); // update the counter 
    } 
}); 
     }); 
</script> 

<!-- dialog window markup --> 
<div id="dialog" title="Your session is about to expire!" style="visibility:hidden"> 
    <p> 
     <span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 50px 0;"></span> 
     You will be logged out in <span id="dialog-countdown" style="font-weight:bold;whitespace:nowrap"></span> seconds. 
    </p> 

    <p>Do you wish to continue your session?</p> 
</div> 
0

維卡斯V給你一些代碼,你可以使用 - 有你的問題的兩個方面是真的不符合我的感覺......

  1. 的Liferay已經有這樣一個機制 - 例如登錄到您的門戶網站並讓它靜置30分鐘(或者將超時時間配置爲更早),然後您會看到您收到警告消息,如果您沒有點擊,則會顯示「已註銷」消息「延長會議」。在6.1中,這甚至可以通過多個打開的選項卡工作(我相信它使用js-cookies來包含時間戳,以便所有選項卡同時超時)
  2. 如果向服務器發出請求以檢查會議仍然活躍,您可能會延長會議時間 - 例如只是檢查會話活着可能會延長它永遠

因此,我的建議是要麼掛接到Liferay的機制(編輯您的問題或是否需要提示在哪裏可以找到它在這裏發表評論,我不得不看它)或者使用你自己的完全客戶端實現。如果您選擇自己的實施(例如像Vikas V建議的那樣),請記住,您可能打開了多個選項卡,並且您不希望被在後臺忘記的陳舊選項卡註銷。

相關問題