Я не знаю, что происходит, но это действительно очевидно в IE 8. Он загружает мою страницу и мои файлы JavaScript.
В моем коде на стороне сервера появляются строки отладки, которые должны активироваться при поступлении ajax-запроса от моего jquery. Или какой-нибудь другой контакт с сервером, такой как обновление страницы.
Итак, у меня есть это
var timeout;
var wait = 300000;
$(function()
{
timeout = null;
timeout = setTimeout("SessionTimeOut()", wait);
$.get('SessionTimeOut', null, function(response)
{
timeout = clearTimeout(timeout);
wait = parseInt(response);
timeout = setTimeout("SessionTimeOut()", wait);
});
});
Это должно запускаться каждый раз, когда страница загружается, и запускать таймер для отслеживания выхода из системы или нет. Я сбрасываю таймер каждый раз, когда они делают запрос к серверу.
В некоторых случаях, когда пользователь входит в систему, он внезапно теряет время. Поэтому я установил таймер по умолчанию на 5 минут, чтобы посмотреть, решит ли это проблему.
Итак, скажите, что время ожидания пользователя истекло, поскольку он неактивен в течение 30 минут. Они возвращаются и отправляются на мою страницу входа. Итак, они собираются на новую страницу. Я надеюсь, что весь этот javascript материал будет уничтожен, а все объекты тайм-аута будут уничтожены.
Затем они пытаются войти (используя IE8). Угадайте, что они получат сообщение о том, что у них истекло время ожидания, поскольку IE8, похоже, больше не хочет запускать этот скрипт.
Я попытался обновить страницу, но это ничего не дает. Похоже, что после запуска сценария он работал все время, пока открыт браузер.
У меня есть много страниц, на которых используется код выше. Тем не менее, если он запускается один раз на одной странице и вы переходите на другую страницу, он больше не запускается.
Единственный способ запустить его снова - закрыть браузер или очистить весь кэш.
Так как я могу заставить его работать снова?
Редактировать
Вот мой код сервера (большая его часть)
public ContentResult SessionTimeOut()
{
var time = signOut.FigureSessionTime();
// minues 2 mins to make up for any lost time.
double total = time.TotalMilliseconds - 120000;
return Content(total.ToString());
}
Таким образом, в основном FigureSessionTime просматривает куки пользователя и проверяет, есть ли куки к концу сессии или они хотят оставаться в системе в течение 2 недель.
Если они выберут 2 недели, то за 2 недели будут возвращены миллисекунды. Если это сеанс, то 30 минут миллисекунд будут возвращены обратно.
Я просто потратил 2 минуты, чтобы быть на стороне сохранения, поэтому клиентская сторона всегда должна тайм-аут перед серверной стороной.
возвращает время в миллисекундах
// это то, что он возвращает
+1670778,4725000001
Редактировать 2
Хорошо, вот что я только что сделал, чтобы проверить некоторые вещи.
IE 8
Запустил страницу, на которую пользователю не нужно входить. Это означает, что нет файла cookie для проверки сеанса, что означает, что -120000 вернется. Это было подтверждено в окне предупреждения. Так как это было похоже на мгновенный тайм-аут, на секунду, когда страница загрузилась, у меня истекло время ожидания.
Затем я попытался зайти на страницу, которая была защищена и которая вынула бы cookie, проверила его и вернула время ожидания. У меня было окно с предупреждением и я проверил, что хранится в переменной ожидания.
То, что пришло окно предупреждения, было -120000, так что этого не должно быть. Это должно быть какое-то большое число. Я был мгновенно вышел из системы и отправлен на страницу входа.
Затем я вошел в «вкладку безопасности» в IE 8 и выбрал «Удалить историю просмотров», всплыло всплывающее окно, я проверил все доступные параметры и нажал «Удалить».
Я делал все это, находясь на моем сайте, и никогда не покидал его. Поэтому я просто ввел свои учетные данные и вошел в систему.
Теперь переменная ожидания содержит это "1677207". Так что это как 27 минут или что-то в этом роде.
Так почему первый раз вернулся отрицательным? Это из-за того, что он впервые вышел на другую страницу и кешировал это, или просто не хотелось работать?
Я сейчас просто устал от чего-то другого. Я очистил историю просмотров и закрыл IE 8. Затем я запустил свой сайт через VS2008 и загрузил его на своей странице входа в систему.
Затем я входил и выходил 5 раз. Каждый раз, когда я входил в систему, я отмечал время ожидания.
Это результаты
1678237
1678237
1678237
1678237
1678237
Так что в 5 раз время было точно таким же, даже без миллисекунды.
Теперь давайте проверим Firefox.
Я сделал то же самое, запустил свой сайт через VS2008, чтобы запустить Firefox и перейти на мою страницу входа.
Я входил и выходил 5 раз. Каждый раз, когда в окне оповещения появлялось время ожидания, я отмечал это.
Это результаты
1677176
1677800
1678003
1677956
1677800
Каждый раз, когда я входил в систему, это было другое время. Так что по какой-то причине Firefox каждый раз возвращал разные результаты, но IE8 волшебным образом всегда мог сделать это в одно и то же время, даже больше или меньше миллисекунды?
После того, как я сделал то, что делал раньше в IE8, я зашел на страницу, на которой пользователь мог бы выйти и вернуть -12000. Я зашел на эту страницу, и она сделала именно это и вернула меня на страницу входа.
Затем я вошел в систему, и время ожидания, которое появилось, было «1677940». Так что на самом деле он пошел и запустил мой код и получил другое время. Где IE8 просто использовал предыдущий -12000 снова и снова. Я мог бы войти в систему миллион раз, и это всегда будет -12000. Как только оно получает значение, оно, кажется, сохраняет его.
Редактировать 3
<ч />
Вы все можете попробовать дома сейчас.
Вот что вам нужно
// Javascript file
var timeout;
var wait = 300000;
$(function()
{
timeout = null;
timeout = setTimeout("SessionTimeOut()", wait);
$.get('SessionTimeOut', null, function(response)
{
timeout = clearTimeout(timeout);
wait = parseInt(response);
alert(wait);
timeout = setTimeout("SessionTimeOut()", wait);
});
/* starts every time a ajax request is made */
$().ajaxStart(function(e)
{
timeout = clearTimeout(timeout);
$('body').css('cursor', 'progress');
});
$().ajaxStop(function(e)
{
$('body').css('cursor', null);
});
$().ajaxComplete(function(event, XMLHttpRequest, ajaxOptions)
{
if (timeout == null)
{
timeout = setTimeout("SessionTimeOut()", wait);
}
});
});
// need to have dialog ui javascript for this.
function SessionTimeOut()
{
// $('#content').append('<div id="SessionTimeout" title="Session Time Out">Your session has timed out. You must sigin again.</div>');
// $('#SessionTimeout').dialog(
// {
// height: 140,
// resizable: false,
// modal: true,
// closeOnEscape: false,
// buttons:
// {
// 'Return To Sign In Page': function()
// {
// window.location.href = "/account/signin";
// }
// }
// });
// $('#ui-dialog-title-SessionTimeout').siblings('a').remove();
}
// Индекс
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script src="../../JScript1.js" type="text/javascript"></script>
</head>
<body>
<div>
</div>
</body>
</html>
// TestController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
public class TestController : Controller
{
//
// GET: /Test/
public ActionResult Index()
{
return View();
}
public ContentResult SessionTimeOut()
{
Random random = new Random();
return Content(random.Next(100).ToString());
}
}
}
Если вы запустите этот код в IE8, вы будете каждый раз получать одно и то же случайное число. Попробуйте в Firefox, и вы не будете.