Повторное представление форм: не завершено один раз, сначала запросите страницу формы -> затем отправьте процесс формы, чтобы заполнить подачу данных
Корневая причина: не выполняя это полностью, сначала запросите страницу формы -> затем отправьте процесс формы.
Вызывает повторные материалы:
ПРИМЕЧАНИЕ. После падения обратно обновите страницу формы и отправьте снова. В настоящее время, вместо того, чтобы повторять представление, отправляется новый запрос. При Firefox операция повторения подчинения на тот же адрес недействительна.
Случай:
@Webservlet ("/trans") public class transferservlet расширяет httpservlet {private static final long serialversionuid = 1l; Защищенный сервис void (httpservletrequest req, httpservletresponse resp) бросает Servletexception, ioException {req.setcharacterencoding («UTF-8»); resp.setContentType ("text/html; charset = utf-8"); Printwriter Out = resp.getWriter (); String money = req.getParameter ("Money"); // Симулировать сетевой задержку try {thread.sleep (3000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Передана сумма:"+money); out.print («Передана сумма:»+деньги); }}Под сумасшедшей точкой вы обнаружите, что страница JSP не изменится, но вы можете видеть через распечатку в фоновом режиме, и она будет выходить непрерывно, указывая, что она выполняется все время
Решение:
Перед отправкой гарантии вы должны сначала запросить интерфейс формы. Принцип такой же, как и код проверки .--- Механизм токенов.
При первом запросе при запросе интерфейса формы создайте токен. Нажав на перевод и отправку запроса, принесите этот токен и отправьте его на следующий интерфейс. Проверьте токен в сервлете. Этот токен - один на сессии и один в форме. Выравнивание означает, что форма верна, и токен в этом сеансе уничтожен.
Код на странице JSP
<% // Создать токен строки token = java.util.uuid.randomuuid (). ToString (); // существует один из сеансов, а затем делает суждение. %> <h3>Transfer interface</h3> <form action="/trans" method="post"> <input type="hidden" name="token" value="<%=token%>"/> Transfer amount:<input type="text" name="money" min="1" required /><br/> <input type="submit" value="transfer" /> </form>
Код в Transferservlet
@Webservlet ("/trans") public class transferservlet расширяет httpservlet {private static final long serialversionuid = 1l; Защищенный сервис void (httpservletrequest req, httpservletresponse resp) бросает Servletexception, ioException {req.setcharacterencoding («UTF-8»); resp.setContentType ("text/html; charset = utf-8"); Printwriter Out = resp.getWriter (); // Получить значение токена в форме string token = req.getParameter ("token"); // Получить значение токена в строке сеанса sessionToken = (string) req.getSession (). GetAttribute ("token_in_session"); // Токен в сеансе легко быть пустым, потому что токен в сеансе является разрушаемым if (token.equals (sessiontoken)) {// указывает, что токен одинаковый req.getSession (). Removeattribute ("token_in_session"); String money = req.getParameter ("Money"); System.out.println («Сумма передачи:»+деньги); out.print («Сумма передачи:»+деньги); // Наконец, уничтожить токен в сеансе} // Если токен отличается, это означает, что это повторное представление и не может быть отправлен}}Затем, чтобы не отображаться в коде Java в файле JSP, создайте и прыгайте токен в другом сервлелете
@Webservlet ("/transfer") public cposepransferservlet расширяет httpservlet {private static final long long serialversionuid = 1l; Защищенный сервис void (httpservlectrequest req, httpservletresponse resp) бросает ServletException, ioException {// Создать токен и прыгать в отправку. System.out.println (токен); req.getSession (). setattribute ("token_in_session", token); req.setattribute ("token", токен); req.getRequestDispatcher ("/views/repeatSubmit/supper.jsp"). }}Это то, на что выглядит файл JSP сейчас
<h3> Интерфейс передачи </h3> <form action = "/trans" method = "post"> <input type = "hidden" name = "token" value = "$ {token}"/> ancressment out: <input type = "text" name = "Money" min = "1"/> <br/> <input type = "value =" transfer "/> </form =" 1 "/> <br/> <input type =" value = "/> </> </> <br/> <br/> <input type =" value = "/> </> </> </> <br/> <input type ="Это намного чище, чем вышеупомянутое и более аккуратное, но все равно не чувствует себя хорошо, потому что, если вам нужно использовать его в других местах, вам нужно создавать токены, проверить токены и удалить токены, поэтому вы извлекаете его, чтобы сделать класс инструментов
Tokenutil.java
// Token Tool Class // Создать токен // Проверьте токен // уничтожить токен открытый класс tokenutil {private final Static String Token_in_session = "token_in_session"; public static void Savatoken (httpservletrequest req) {string token = uuid.randomuuid (). toString (); System.out.println (токен); req.getSession (). setattribute (token_in_session, token); req.setattribute ("token", токен); } public static boolean validatetoken (httpservletrequest req, string tokenRequest) {// Получить значение токена в sessionstring sessiontoken = (string) req.getSession (). getattribute (token_in_session); if (tokenInRequest.equals (sessionToken)) {req.getSession (). RemeaTtribute (token_in_session); вернуть истину; } вернуть false; }}Это нормально. Пользователь должен только называть этот класс инструментов, и нет необходимости писать серию операций, таких как создание токена.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.