2014-10-19 3 views
1

Я ищу способ обнаружения, когда страница перезагружается после нажатия кнопки «Назад», поэтому я могу выборочно игнорировать ошибки. Позвольте мне объяснить, почему:Обнаружение перезагрузки страницы после нажатия кнопки в PHP

Представьте страницу, которая отображает некоторые данные, идентифицированный идентификатором:

/show/some/data?id=5 

Первоначально идентификатор существует и отображается страница. Если идентификатор не существует, отображается сообщение об ошибке и регистрируется ошибка, поскольку это не должно происходить и указывать на неработающую ссылку в приложении.

Теперь представьте, что пользователь просматривает данные, решает удалить их и после удаления использует кнопку «Назад», чтобы снова перейти на ту же страницу (BTW это не гипотетический, я видел это в своем приложении). Теперь идентификатор уже недействителен, вызывая ошибку. Если бы я мог различать начальную загрузку страницы и загрузку второй страницы после использования кнопки «Назад», я мог бы быть более мягким в обработке ошибок. Мое рассуждение о том, что сломанная (прямая) ссылка в приложении является фатальной ошибкой. Сломанная ссылка после щелчка назад (когда ее не было ни одного изначально), скорее всего, вызвано некоторыми действиями, предпринятыми пользователем тем временем. В этом случае я бы скорее перенаправил пользователя на обзорную страницу, чем показала ошибку приложения.

Я считаю, что один из способов решить эту проблему было бы приложить некоторые случайно сгенерированный идентификатор в URL:

/show/some/data?id=5&rnd=<?php print rand(); ?> 

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

Однако это потребует изменения многих ссылок в приложении. Я мог бы также использовать JavaScript/JQuery, чтобы изменить все ссылки на страницы того же эффекта:

$("a").attr('href', function (i, h) { 
    return h + (h.indexOf('?') != -1 ? "&" : "?") + "rnd=" + Math.random(); 
}); 

Это немного менее агрессивны, но все еще довольно жесткой для решения такой, казалось бы, тривиальные проблемы. Интересно, существует ли или может быть автономный способ сделать это. Есть ли какой-либо способ для бэкэнд-приложения различать, загружается ли страница путем переадресации по ссылке или перезагрузки после нажатия? Или есть более элегантное решение с javascript?

ответ

0

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

Затем вам необходимо обновить обработчик ошибок, чтобы дополнительно проверить наличие запрошенного идентификатора страницы в списке удаленных страниц. Таким образом вам вообще не придется возиться с URL-адресами.

Вот пример поток:

  • страница пользователя запрашивает идентификатор 1
  • приложение проверяет дб, не существует
  • приложения проверяет сессию, не в списке удаленных страниц
  • сообщение об ошибке показано, ошибка зарегистрирована на сервере
  • пользовательские запросы страница id 2
  • приложение проверяет db, оно существует, показывает страницу пользователю
  • пользователя нажимает кнопку удаления
  • ID страницы добавляются к списку сессии удаляемой страницы и страница будет удален
  • пользователя возвращается (или типов URL-адрес вручную, это особенность бонуса)
  • приложение проверяет БД, идентификатор 2 не существует
  • приложение проверяет сеанс, идентификатор 2 находится в списке, удаленные страницы
  • сообщение об ошибке показано, никакие ошибки не вошли

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

Смежные вопросы