Нарушенная история для самообновляющейся формы с использованием post-redirect-get

#browser-history #html5-history #post-redirect-get

#история браузера #html5-история #сообщение-перенаправление-получить #post-redirect-get

Вопрос:

У меня есть URL /books , в котором перечислены некоторые книги, и шаблон URL /books/{some-book-title} , который показывает форму просмотра / обновления метаданных книги. Вот типичная история пользователя, где пользователь исправляет неверную запись автора:

 GET /books

  <a href="/books/ulysses">Ulysses</a>
  <a href="/books/don-quixote">Don Quixote</a>

GET /books/ulysses

  <form action="/books/ulysses" method="post" enctype="application/x-www-form-urlencoded">
    <input name="author" value="Jamessss Joycessss">
  </form>

POST /books/ulysses FORMDATA author=James Joyce

  Redirect 303 SEE OTHER location = /books/ulysses

GET /books/ulysses

  <form action="/books/ulysses" method="post" enctype="application/x-www-form-urlencoded">
    <input name="author" value="James Joyce">
  </form>
  

Проблема в том, что стек истории теперь

  • /books
  • /books/ulysses
  • /books/ulysses

чтобы, когда пользователь нажимает «назад», он не возвращался к /books , а просто обновлял текущую страницу. Есть ли способ, отличный от javascript, обработать случай обновления, чтобы кнопка «Назад» имела ожидаемое поведение? И если нет, то каков способ javascript исправить это?

РЕДАКТИРОВАТЬ: еще более запутанно, если вы публикуете несколько раз

 GET /books
GET /books/ulysses    author=Jamesss Joycesss
POST author=3  ->  redirect shows author=3
POST author=2  ->  redirect shows author=2
POST author=1  ->  redirect shows author=1
Press back button /books/ulysses shows author=1
Press back button /books/ulysses shows author=2  (!!!)
Press back button /books/ulysses shows author=3  (!!!)
Press back button /books
  

Комментарии:

1. Не знаю, какой фреймворк или систему вы используете, но можете ли вы просто вернуть тот же ответ из POST, что и get, избегая перенаправления?

2. Я специально использую шаблон post-redirect-get. Когда пользователи нажимают кнопку «Назад», я не хочу, чтобы Chrome выдавал им диалоговое окно «повторно отправить данные», и post-redirect-get выполняет эту задачу.

Ответ №1:

Способ изменения поведения кнопки «Назад» на JavaScript заключался бы в использовании API истории

Вот быстрый способ перейти на первую страницу в стеке истории. Просто добавьте прослушиватель событий для кнопки «Назад» и используйте history API.

 window.history.go(0);
  

Взгляните на API :https://developer.mozilla.org/en-US/docs/Web/API/History_API

Комментарии:

1. Но я бы хотел такого поведения только в тех случаях, когда я был перенаправлен на ту же страницу. Есть ли способ узнать, был ли я просто перенаправлен на ту же страницу?

2. Вы можете узнать, проверив код состояния HTTP для этой страницы, он должен быть 30X для перенаправления.