ASP.Net: срок действия страницы при переходе назад

По сути, все страницы на этом сайте, которые я создаю, не могут быть доступны, когда пользователь нажимает «Назад» (или с помощью клавиш управления) в браузере, и страница должна истечь, если кто-то пытается вернуться в историю.

Я положил в Global.asax :: Application_BeginRequest

    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1))
    Response.Cache.SetValidUntilExpires(False)
    Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches)
    Response.Cache.SetNoStore()

Это очистит кеш и запретит возвращаться к любым страницам, когда пользователь вышел из системы, но не выполняет работу, пока пользователь вошел в систему.

Я видел сообщения, в которых люди предлагали использовать подход javascript, позвонив

    History.Forward(1)

на странице. Но я бы не хотел этого делать, так как для работы потребуется включенный javascript (который пользователь может отключить).

Ценю любые предложения.


person K2so    schedule 17.03.2010    source источник
comment
Я считаю, что ответ здесь: stackoverflow.com/questions/64059/   -  person Jørn Schou-Rode    schedule 17.03.2010


Ответы (2)


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

person Kelsey    schedule 17.03.2010
comment
Согласованный. Вы можете контролировать срок действия страницы на своем веб-сервере (с помощью заголовков / метаданных или кода), но вы не можете ничего сделать с поведением клиента и сети (кеш баузеров, кеш прокси ...). - person JoeBilly; 17.03.2010
comment
Спасибо. Оцените ваш совет. Чтобы добавить, сайт уже использует https. И да, как упоминала Келси, он вызывает перезагрузку, но я все еще могу нажать «Отправить повторно» (в firefox), и опубликованные данные будут повторно отправлены в результате, и страница будет перезагружена с данными. На странице без каких-либо сообщений это даже не подтверждение, а просто отображение страницы в том виде, в каком она была. Я сделал больше поисков, и кажется, что это частый вопрос, но без верного решения. Такие хаки, как упомянутый мною изначально javascript, на данный момент кажутся наиболее предлагаемым обходным путем. Думаю, нет другого известного способа? - person K2so; 22.03.2010

После большого количества времени, потраченного на исследования и испытания, я реализовал обходной путь и решил поделиться им на случай, если кто-то другой сочтет его полезным. Этот (наиболее близкий к решению, но только за исключением Firefox) обходной путь приведет к:

  1. IE6 - 8: всплывает сообщение "Срок действия страницы истек"
  2. Chrome: появляется сообщение "Подтвердите повторную отправку формы"
  3. Firefox: появится диалоговое окно с запросом на повторную отправку данных публикации.

Временное решение:

  1. С настройками Response.Cache, указанными в исходной проблеме, опубликованной выше
  2. Измените все гиперссылки на другую страницу сайта на LinkButton.
  3. Установите PostBackURL в LinkButton на URL-адрес href ссылки. Это необходимо, потому что только с POST вместе с установленным заголовком, браузер истечет срок действия первоначально опубликованной страницы в истории и запросит повторную отправку.
  4. Вместо использования Response.Redirect в исходном коде используйте Server.Transfer, поскольку Response.Redirect будет использовать GET для другой страницы.

Это решение не запрещает пользователю возвращаться на страницу в истории, но требует подтверждения, следует ли публиковать данные еще раз. History.Forward(1) не работает достаточно хорошо, как упоминалось в исходном сообщении, и я также признаю возможность автоматического повторного размещения на странице без каких-либо предупреждений, что по существу приводит к тому, что на сервер отправляется несколько запросов.

Основная идея состоит в том, чтобы отправлять POST на каждую страницу вместо GET, и поэтому каждая посещенная страница на сайте будет уступать странице с истекшим сроком действия при переходе назад. Теперь пользователь всегда может обновиться, чтобы повторно опубликовать данные.

person K2so    schedule 29.03.2010