Как избежать повторной отправки в JSP при обновлении? - PullRequest
18 голосов
/ 23 августа 2009

Я пишу программу, но у меня возникла проблема: когда я обновляю страницу jsp, система автоматически повторно отправляет всю страницу, и я не знаю, как этого избежать, кто-нибудь может мне помочь?

Ответы [ 7 ]

20 голосов
/ 23 августа 2009

Вот объяснение проблемы ...

Нажатие на кнопку «отправить» в форме отправляет запрос на веб-сервер, который включает в себя все данные, введенные в форму. Не только URL, но и данные формы являются частью запроса, и этот запрос запоминается браузером. Если пользователь нажимает «обновить», браузер повторяет запрос, снова отправляя те же данные формы URL и на веб-сервер.

Но формы могут быть отправлены двумя разными способами, GET или POST, в зависимости от атрибута «method» тега «form». Существует соглашение, что запрос GET не имеет побочных эффектов; он только выбирает данные, но не вносит никаких изменений в базу данных. С другой стороны, если запрос изменяет данные, он всегда должен использовать запрос POST. Как я уже сказал, это всего лишь условные обозначения, и между ними нет особых технических различий, но очень важное различие заключается в том, что браузеры будут предупреждать пользователя, если они попытаются повторить POST - при нажатии кнопки «обновить» появится диалоговое окно. предупреждение пользователя о том, что это может привести к повторению операции, и подтверждение того, что он действительно хочет повторить отправку. Браузер не показывает это подтверждение при обновлении запроса GET.

Использует ли ваша форма метод GET, как подозревает @mk? Если это так, то изменение его на POST является самым простым решением, поскольку это будет по крайней мере означать, что пользователь будет предупрежден, если попытается обновить.

Но лучшим решением является идиома POST + REDIRECT + GET, предложенная @cletus. Это разделяет обновление базы данных (POST) и представление (GET) на две операции. Нажав на кнопку «Обновить» в браузере, вы просто повторяете GET, который не имеет побочных эффектов.

11 голосов
/ 23 августа 2009

Здесь вам нужна идиома:

  1. POST + REDIRECT + GET ; или
  2. Отправка формы AJAX.

POST + REDIRECT + GET работает следующим образом:

  1. Для отправки формы используется метод POST;
  2. Когда JSP или (надеюсь) сервлет получает POST, он делает все, что ему нужно (сохраняет или обновляет данные или что-то еще);
  3. Затем сервлет или JSP использует HTTP-заголовок Location: для перенаправления пользователя на тот же URL-адрес.

Преимущество этого заключается в том, что нажатие кнопки «перезагрузить» не отправляет форму повторно. Также, если вы нажмете кнопку «Назад» в браузере, вам не будет предложено «отправить снова?» диалоговое окно.

Вот пример JSP этого.

Передача AJAX означает, что вместо отправки формы обратно на сервер в традиционном смысле вы создаете запрос AJAX обратно на сервер с данными формы. Это подчинение делает то, что ему нужно. Нажав на перезагрузку, вы просто перезагрузите страницу. Он не отправляет запрос AJAX.

0 голосов
/ 26 июня 2019

Работает с использованием следующего скрипта.

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>
0 голосов
/ 09 июня 2018

Мы можем использовать Шаблон Post / Redirect / Get (PRG) , чтобы решить проблему многократная подача одних и тех же данных.

Работает следующим образом:

Первый раз, когда пользователь отправляет форму на сервер POST или GET метод, затем мы обновляем состояние в базе данных приложения.

Затем мы отправляем ответ перенаправления, чтобы отправить ответ клиенту.

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

enter image description here

0 голосов
/ 19 августа 2014

Вот решение

@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse     response) throws Exception {
    try {   

        if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
        {
        request.setCharacterEncoding("UTF-8");

        String xxx=request.getParameter("xxx");
        S
        boolean result=object.method(xxx);
        String message="";//reurning a messgae is sucess
        if(result==true)
        {
            message="Data Saved successfully";
        }
        else
        {
            message="Error while saving data";  
        }

        return  (new ModelAndView(getMasterrulescreation(),"message",message));
        }
        else //if no value in primary key redirect fresh page 
        {
            return  (new ModelAndView(getMasterrulescreation()));
        }
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}   
0 голосов
/ 25 августа 2010

ЕСЛИ вы используете JSP на стороне сервера и используете сервлет контроллера для управления направлением страницы. Вы можете просто изменить режим направления страницы с Переадресация на страницу. Таким образом, вы можете предотвратить повторную отправку формы. это было бы полезно понять

привет! * * 1005

0 голосов
/ 23 августа 2009

Не используйте GET для отправки или иного изменения данных. Вместо этого используйте POST. Вы хотите изменить свою форму на

<form action="test.jsp" method="get">

Подробнее см. http://www.google.com/search?q=get+post.

(Ваш вопрос также немного неясен - вы имеете в виду обновление в браузере или в контейнере (например, Tomcat)? угадали, что вы имели в виду, если вы имели в виду что-то еще, дайте нам знать.)

...