Предупреждать пользователя перед таймаутом сеанса
У меня есть веб-приложение, реализованное в Spring MVC
, JSP
.
Тайм-аут сеанса по умолчанию определяется в web.xml
составляет 30 минут.
если пользователь простаивает в течение 25 минут, чем мне нужно показать всплывающее окно с сообщением, что Your session is going to be end by 5 min, Please click OK to continue
.
Можно ли достичь этого, используя JavaScript
, jquery
или любой другой подход?
Прошу предложить.
Ответы
Ответ 1
Попробуйте этот код. Надеюсь, это решит вашу проблему. Благодаря
var cookieName = 'sessionMsg';
var message = 'Your session is going to be end by 5 min, Please click OK to continue';
function getCookie(name)
{
var name = name + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++)
{
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
}
function setSessionPrompt() {
var timeout = getCookie(cookieName) - new Date().getTime();
setTimeout(function(){
if (new Date().getTime() < getCookie(cookieName)) {
setSessionPrompt();
} else {
if(confirm(message)) {
// do your action here
}
}
}, timeout);
}
setSessionPrompt();
Ответ 2
Вы можете использовать следующее: Я использую это на странице jsp, например header.jsp. Он отлично работает для меня. Я использую spring, jsp и jquery.
JavaScript:
<code>
<script type="text/javascript">
//var recall = true;
function loadDialog() {
var sessionAlive = ${pageContext.session.maxInactiveInterval};
var notifyBefore = 30; // Give client 15 seconds to choose.
setTimeout(function() {
$(function() {
$( "#dialog" ).dialog({
autoOpen: true,
maxWidth:400,
maxHeight: 200,
width: 400,
height: 200,
modal: true,
open: function(event, ui) {
setTimeout(function(){
$('#dialog').dialog('close');
}, notifyBefore * 1000);
},
buttons: {
"Yes": function() {
$.get("/about", function(data,status){
// alert("Data: " + data + "\nStatus: " + status);
});
$('#dialog').dialog("close");
loadDialog();
},
"No": function() {
$('#dialog').dialog("close");
}
},
close: function() {}
});
});
}, (sessionAlive - notifyBefore) * 1000);
};
loadDialog();
</script>
HTML Div:
<div id="dialog" title="Session Timeout Info" style="display:none">
<p>
Your session will be timeout within 30 seconds. Do you want to continue session?
</p>
</div>
</code>
Ответ 3
Вы можете отправить cookie с оставшимся временем (в миллисекундах) по каждому запросу. Затем вы можете использовать setTimeout, как было предложено, но снова проверить значение, когда выполняется функция тайм-аута. Если значение изменилось, вы можете reset время ожидания. Поскольку cookie установлен для всего домена, он всегда будет правильным даже для ajax или других вкладок.
var cookieName = 'sessionMsg';
var message = 'Your session is going to be end by 5 min, Please click OK to continue';
function getCookie(name)
{
var name = name + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++)
{
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
}
function setSessionPrompt() {
var timeout = getCookie(cookieName) - new Date().getTime();
setTimeout(function(){
if (new Date().getTime() < getCookie(cookieName)) {
setSessionPrompt();
} else {
if(confirm(message)) {
// do your action here
}
}
}, timeout);
}
setSessionPrompt();
Ответ 4
Чтобы уведомить пользователя о тайм-аутах в интерфейсе, вам необходимо передать эту информацию с вашего сервера. Для этого я использовал информацию в https://www.javaworld.com/article/2073234/tracking-session-expiration-in-browser.html в качестве базовой линии.
В каждом методе Response в вашем контроллере вам необходимо включить файлы cookie, содержащие время ожидания сеанса, а также текущее время сервера. Поскольку, похоже, вы уже установили тайм-аут сеанса в своем web.xml, вы можете добавить файлы cookie к вашему ответу с чем-то похожим на:
@RequestMapping(value="/example", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public ResponseEntity<Object> getExample(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
addTimeoutCookies(servletRequest, servletResponse);
//Do actual actions
return new ResponseEntity<Object>(HttpStatus.OK)
}
private void addTimeoutCookies(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
long currTime = System.currentTimeMillis();
long expiryTime = currTime + servletRequest.getSession().getMaxInactiveInterval() * 1000;
Cookie serverTimeCookie = new Cookie("serverTime", "" + currTime);
serverTimeCookie.setPath("/");
servletResponse.addCookie(serverTimeCookie);
Cookie expiryCookie = new Cookie("sessionExpiry", "" + expiryTime);
expiryCookie.setPath("/");
servletResponse.addCookie(expiryCookie);
}
Затем на интерфейсе вам нужно получить значения этих куки файлов и сравнить их с текущим временем клиента, чтобы определить, когда следует уведомить пользователя о предстоящем тайм-ауте сеанса. Вот простой блок кода, чтобы сделать это, на основе других ответов здесь и статьи по ссылке:
var currTimeCookieName = 'serverTime';
var expireTimeCookieName = 'sessionExpiry';
var offset;
var warningTime = 5 * 60 * 1000;
var timeoutWarningMessage = 'Your session is going to be end by 5 min, Please click OK to continue';
function getCookie(name)
{
var name = name + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++)
{
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
}
var serverTime = getCookie(currTimeCookieName);
serverTime = serverTime==null ? null : Math.abs(serverTime);
var offset = (new Date()).getTime() - serverTime;
function getTimeToWarning() {
var expireTime = getCookie(expireTimeCookieName);
return expireTime + offset - currTime - warningTime;
}
function checkForTimeout() {
var timeUntilWarning = getTimeToWarning();
setTimeout(function(){
if (getTimeToWarning() > 0) {
checkForTimeout();
} else {
if(confirm(timeoutWarningMessage)) {
//TODO do a backend call or other action to extend the session here
setTimeout(function() {
checkForTimeout();
}, 1 * 60 * 1000);
}
}
}, timeUntilWarning);
}
checkForTimeout();
Ответ 5
Вы должны использовать WebSockets для отправки данных из веб-приложения в браузер клиентов.
1) рассчитать таймауты сеанса на стороне сервера.
2) Websocket отправит сообщение о времени сеанса.
Ответ 6
Вы можете использовать следующий плагин - Jtimeout JQuery плагин
Работает отлично и настраивается тоже.
Ответ 7
Знаете ли вы
windows.setTimeout
http://www.w3schools.com/jsref/met_win_settimeout.asp
Это то, что вам нужно
Например
var resetTime_int;
function resetTimer(){
if(resetTime_int) window.clearTimeout(resetTime_int)
resetTime_int=window.setTimeout(function (){
if(prompt('Your session is going to be end by 5 min, Please click OK to continue'))
location.reload()
}, 1000*60*25)
}
resetTimer()
document.onmousemove=resetTimer
document.onkeyup=resetTimer
1000 * 60 * 25 = 25 минут.