Как избежать повторной отправки в jsp при обновлении?

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

Ответы

Ответ 1

Здесь объяснение проблемы...

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

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

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

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

Ответ 2

Идиома, которую вы хотите здесь, либо:

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

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

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

Вот пример JSP.

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

Ответ 3

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

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

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

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

Ответ 4

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

привет!

Ответ 5

Вот решение

@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;
    }
}   

Ответ 6

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

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

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

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

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

enter image description here

Ответ 7

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

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>