如何发送ajax请求来检查会话超时并在grails中呈现重新登录消息?

时间:2012-07-23 07:53:48

标签: ajax grails

我想向用户显示一条消息,“你已经注销了,请重新登录!”当会话超时时,发送 ajax请求每一次。如果会话计时器结束,我想发送显示上述消息的最终ajax请求。但这里的问题是我不知道我应该在哪里保留我的ajax和jquery代码,因为我对ajax请求知之甚少,任何人都可以用代码解释这个过程。在siple中,我的要求就像facebook在会话超时时所显示的那样,或者当多人选项卡中的任何一个选项卡被注销时。我正在开展 grails项目

2 个答案:

答案 0 :(得分:4)

像你这样做你的ajax请求

$.ajax({
    url:url,
    type:"POST",  // or get
    data:parameters,
    success: function(data) {
    // do procedure if success
          }
    error : function(xhr, type, error){
    // do procedure if fail
            // may be send a message to the server side to display a message that     shows session timeout
       }
});

在错误功能

中处理会话超时

答案 1 :(得分:0)

我自己做了,这是它的“gracefulSession.js”的js代码,并在你要嵌入你的HTML代码的页面上调用这个javascript。

function checkSessionStatus() {

    var lStorage = getLocalStorage();
    if (lStorage) {
        //lStorage.setItem('poleTime',new Date());
        var poleTime = lStorage.getItem("poleTime");
        var parsedTime;
        try {
            parsedTime = new Date(poleTime);
        } catch (e) {}

        //alert(new Date()-parsedTime)
        //alert(new Date())
        //alert(parsedTime)

        //3900000 = 1H5M

        if (parsedTime && (new Date() - parsedTime) < 3900000) {
            //alert('NCATCH'+parsedTime);
        } else {
            //alert('POINT');
            poleSessionStatus();
        }
    }
}

function setlatestPoleTIme() {

    //alert("SETTING POLE TIME");
    var lStorage = getLocalStorage();
    if (lStorage) {
        lStorage.setItem('poleTime', new Date());
    }
}

function setCheckSessionTimer() {

    var lStorage = getLocalStorage();
    var isLoggedOut = false;
    if (lStorage) {
        if (lStorage.getItem('isLoggedOut') == 'true') {
            isLoggedOut = true;
        }
    }

    //console.log('checkingIfLoggedOut');

    if (!isLoggedOut) {

        setTimeout("setCheckSessionTimer();", 5000);
        //console.log("NOPT LO");
        $('#LoggedoutMessage').hide();
        checkSessionStatus();
    } else {

        setTimeout("setCheckSessionTimer();", 5000);
        //console.log("KO");
        //alert("You're Logged Out from  other tab");
        $('#LoggedoutMessage').show();

    }

}

function logout() {

    //alert("LOGGIN OUT")
    var lStorage = getLocalStorage();
    if (lStorage) {
        lStorage.setItem('isLoggedOut', 'true');
    }
}

function resetLoggedOutFLag() {

    var lStorage = getLocalStorage();
    if (lStorage) {
        lStorage.removeItem('isLoggedOut');
    }
}


function getLocalStorage() {

    var storage, fail, uid;
    try {
        uid = new Date;
        (storage = window.localStorage).setItem(uid, uid);
        fail = storage.getItem(uid) != uid;
        storage.removeItem(uid);
        fail && (storage = false);
    } catch (e) {}
    return storage
}

现在,要嵌入HTML代码,

<div id="LoggedoutMessage" style="display:none;position:absolute;background:black;height: 200%;width:100%;top: 0;z-index: 10000;opacity: 0.9;">
    <div id="login_box" style="position:fixed;left:38%;top:30%; padding:10px; width: 365px;margin: 0 auto;border: 0px solid #CCC;margin-top: 35px;height: 150px;background: white; border-radius:3px;">
        <div id="login_title">
            <h1>You have been logged out.</h1>
        </div>
        <div id="reLogin">
            <p>Please login to continue.</p>
            <g:link controller="dashBoard" action="index" target="_blank" onclick="logout();">Login</g:link>
        </div>
    </div>
</div>

最后,在保留html的地方,将此javascript代码保留在嵌入脚本标记的顶部:

function poleSessionStatus() {

    jQuery.ajax({
        type: 'POST',
        data: '',
        url: '<g:createLink action="ajaxCheckSession" controller="dashBoard"/>',
        success: function (data, textStatus) {
            //setTimeout ( "checkSession();", 5000);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            $('#LoggedoutMessage').show();

        },
        complete: function (XMLHttpRequest, textStatus) {
            $.unblockUI();
        }
    });
}
相关问题