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

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

6 ответов


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

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

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

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

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


идиома ты хочешь вот это:

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

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

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

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

здесь пример JSP этого.

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


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

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

см.http://www.google.com/search?q=get + сообщение для получения дополнительной информации.

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


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

с уважением!


вот решение

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

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

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

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

затем мы отправим ответ перенаправления для отправки ответа клиенту.

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

enter image description here