Автоматически перенаправьте пользователя, когда сессия Испытает таймаут или пойдет неактивная

Вы можете создать модель, которая поддерживает состояние статуса входа пользователя и представление, которое отображает другой шаблон в зависимости от этого состояния. В представлении может отображаться шаблон «поля ввода», если пользователь не вошел в систему, и другой шаблон, если он зарегистрирован. Я бы сохранил весь доступ к localStorage в модели, потому что представление не должно быть связано с постоянством. Представление, вероятно, также не должно касаться ключа API, и поэтому у меня есть привязка представления к изменению loggedIn модели ('change: loggedIn') вместо изменения apiKey ... хотя я показываю ключ API в одном моих шаблонов только для демонстрационных целей. Вот мой очень упрощенный образец. Обратите внимание, что я не удосужился проверить ключ API, но вы, вероятно, захотите:

Шаблоны:

<script id="logged_in" type="text/html">
    You're logged in.  Your API key is <%= escape('apiKey') %>. Let's proceed with the application...
</script>
<script id="not_logged_in" type="text/html">
    <form class="api_key">
        API Key: <input name="api_key" type="text" value="" />
        <button type="sumit">Submit</button>
    </form>
</script>

Модель и представление магистрали:

var LoginStatus = Backbone.Model.extend({

    defaults: {
        loggedIn: false,
        apiKey: null
    },

    initialize: function () {
        this.bind('change:apiKey', this.onApiKeyChange, this);
        this.set({'apiKey': localStorage.getItem('apiKey')});
    },

    onApiKeyChange: function (status, apiKey) {
        this.set({'loggedIn': !!apiKey});
    },

    setApiKey: function(apiKey) {
        localStorage.setItem('apiKey', apiKey)
        this.set({'apiKey': apiKey});
    }

});

var AppView = Backbone.View.extend({

    _loggedInTemplate: _.template($('#logged_in').html()),
    _notLoggedInTemplate: _.template($('#not_logged_in').html()),

    initialize: function () {
        this.model.bind('change:loggedIn', this.render, this);
    },

    events: {
        'submit .api_key': 'onApiKeySubmit'
    },

    onApiKeySubmit: function(e){
        e.preventDefault();
        this.model.setApiKey(this.$('input[name=api_key]').val());
    },

    render: function () {
        if (this.model.get('loggedIn')) {
            $(this.el).empty().html(this._loggedInTemplate(this.model));
        } else {
            $(this.el).empty().html(this._notLoggedInTemplate(this.model));
        }
        return this;
    }
});

var view = new AppView({model: new LoginStatus()});
$('body').append(view.render().el);
6
задан MichaelICE 16 June 2009 в 23:47
поделиться

3 ответа

Вы можете использовать простое метаобновление :

<meta http-equiv="refresh" content="180;url=http://example.com/logout" />

Или вы реализуете тайм-аут с PHP:

session_start();
if (isset($_SESSION['LAST_REQUEST_TIME'])) {
    if (time() - $_SESSION['LAST_REQUEST_TIME'] > 180) {
        // session timed out, last request is longer than 3 minutes ago
        $_SESSION = array();
        session_destroy();
    }
}
$_SESSION['LAST_REQUEST_TIME'] = time();

Тогда вам не нужно проверять каждые 3 минуты, действителен ли сеанс.

11
ответ дан 9 December 2019 в 20:48
поделиться

Новое и улучшенное решение

Как указал г-н Кеннеди, мое исходное решение (ниже) не работает. так что вот способ сделать это.

В базе данных пользователей храните метку времени последней активности, которая обновляется каждый раз, когда пользователь загружает страницу.

Затем в checkaccess.php

if ( time-last_access > max_inactivity_time ) {
     return array('access' => '0');
}
else {
     return array('access' => '0');
}

Вызовите checkaccess.php в таймер javascript (ниже) и выход из системы соответственно

Это также позволяет использовать функцию «пользователи, вошедшие в систему» ​​

спасибо, мистер Кеннеди


Оригинальное, нерабочее решение

Создайте страницу php, которая возвращает 1 или 0 на основе действительности текущего сеанса пользователя

Затем на ваших страницах, для которых вы хотите установить тайм-аут, добавьте это в заголовок (вам нужен jquery)

setInterval(function(){
   var url = UrL_OF_SESSION_CHECKING_PAGE;
      $.getJSON( url,
         function( data ) {
            if (data.access=='0') {
               window.location = LOGIN_PAGE;
            }
         }
      );
}, 180000);

Каждые 180 секунд (3 минуты) он запрашивает страницу php и получает достоверность сеанса. http://ejohn.org/blog/how-javascript-timers-work/

Простая страница проверки сеанса

session_start();
die(
    json_encode(
        isset( $_SESSION['VARIABLE'] ) ? array( 'access' => '1') : array( 'access' => '0' )
    )
);

измените VARIABLE на одну из переменных сеанса

1
ответ дан 9 December 2019 в 20:48
поделиться

Если вы хотите, чтобы это произошло до того, как страница даже обновится, вам понадобятся периодические вызовы ajax. Вы можете использовать jQuery Heartbeat для звонков каждые 3 минуты и использовать один из методов PHP, уже предоставленных другими пользователями, для проверки сеанса

0
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: