Как остановить браузер (особенно Internet Explorer) от супер кеширования JavaScript? - PullRequest
2 голосов
/ 26 декабря 2009

Я не знаю, что происходит, но это действительно очевидно в 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, и вы не будете.

Ответы [ 3 ]

3 голосов
/ 27 декабря 2009

У меня недавно была похожая проблема. Отключение кэширования для May Ajax Call очистило его. Попробуйте этого парня:

var timeout;
var wait = 300000;
$(function()
{
    timeout = null;
    timeout = setTimeout("SessionTimeOut()", wait);
    $.ajax({
        url:'SessionTimeOut', 
        success:function(response) {
            timeout = clearTimeout(timeout);
            wait = parseInt(response);
            timeout = setTimeout("SessionTimeOut()", wait);
        },
        type:'get',
        cache:false
    });
});

обратите внимание на кеш: ложная опция

1 голос
/ 26 декабря 2009

Учитывая, что эксперты по JQuery и ASP.NET не высказываются, я добавлю свои 0,02 евро: сомневаюсь, что это исключительно проблема кэширования. Я не говорю на JQuery достаточно свободно, чтобы понять, что делает ваш Ajax-вызов, но у меня есть ощущение, что проблема скорее в кешировании, чем в нем. Но я могу ошибаться там.

В любом случае, самый простой способ предотвратить кэширование файла Javascript - добавить случайную метку времени к URL:

<script language='script.js?timestamp=1020349302930'>

это заставит скрипт загружаться заново в каждом экземпляре. Если вы можете использовать только JS, вы можете использовать Math.rand для создания случайного значения, а затем создать или document.write теги <script>. Или, конечно, используйте серверный язык по вашему выбору. (Я только что видел в ваших тегах, что это ASP.NET)

Более чистым способом будет установка правильных заголовков кэширования либо в конфигурации вашего сервера, либо путем динамической отправки заголовков внутри файлов JS (которые должны анализироваться таким языком, как PHP или ASP, для сделай это).

Может быть, это дает новый вклад в поисках того, что не так. Удачи!

0 голосов
/ 26 декабря 2009

Я согласен с Пеккой, что проблема скорее всего не в кешировании браузера.

Похоже, вы используете вызов $get для получения значения тайм-аута с сервера. Это кажется ... странным. Если это не , что вы пытаетесь сделать, то почему вы анализируете ответ как значение тайм-аута? Если это является тем, что вы пытаетесь сделать, то уверены ли вы, что возвращаемый ответ содержит значение, которое вы ожидаете, что он будет содержать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...