Вы можете создать модель, которая поддерживает состояние статуса входа пользователя и представление, которое отображает другой шаблон в зависимости от этого состояния. В представлении может отображаться шаблон «поля ввода», если пользователь не вошел в систему, и другой шаблон, если он зарегистрирован. Я бы сохранил весь доступ к 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);
Вы можете использовать простое метаобновление :
<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 минуты, действителен ли сеанс.
Как указал г-н Кеннеди, мое исходное решение (ниже) не работает. так что вот способ сделать это.
В базе данных пользователей храните метку времени последней активности, которая обновляется каждый раз, когда пользователь загружает страницу.
Затем в 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 на одну из переменных сеанса
Если вы хотите, чтобы это произошло до того, как страница даже обновится, вам понадобятся периодические вызовы ajax. Вы можете использовать jQuery Heartbeat для звонков каждые 3 минуты и использовать один из методов PHP, уже предоставленных другими пользователями, для проверки сеанса