在liferay中是否可以独立于portlet进行ajax调用?

时间:2013-05-30 14:48:37

标签: ajax liferay liferay-6

我想从javascript代码调用ajax(以检查用户会话是否仍处于活动状态)。我希望我的代码独立于任何portlet,因此希望在javascript中构建url,而不必依赖于portlet id。

这可能在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());
}

2 个答案:

答案 0 :(得分:0)

Vikas V为您提供了一些可以使用的代码 - 您的问题有两个方面与我的看法不相符......

  1. Liferay已经有了这样的机制 - 例如登录到您的门户并让它静置30分钟(或将超时配置为更早),您将看到收到警告消息,如果您没有单击,则会显示“您已经注销”消息“延长会议”。在6.1中,这甚至可以通过多个打开的选项卡(我相信它使用js-cookies来包含时间戳,以便所有选项卡同时超时)
  2. 如果您向服务器发出请求以检查会话是否仍处于活动状态,则可能会延长会话时间 - 例如只检查正在进行的会话可能会永久延长
  3. 因此,我的建议是要么加入Liferay的机制(编辑你的问题或在这里评论,如果你需要提示找到它,我必须查找它)或使用你自己的完全客户端实现。如果您选择自己的实现(例如Vikas V建议),请记住,您可能打开了多个选项卡,并且您不希望被在后台忘记的陈旧选项卡注销。

答案 1 :(得分:-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>