index.jsp 폼 제출 처리를 위한 폼 서블릿에 의해 제출된 페이지에 대한 TokenServlet.java
1. 반복 제출:
① 폼이 서블릿에 제출되고, 서블릿은 요청 전달을 통해 응답합니다. (html) 페이지에서 주소 표시줄에는 여전히 Servelt의 경로가 유지됩니다. 응답 페이지에서 "새로 고침"을 클릭하세요.
② 응답 페이지가 브라우저에 도달하지 않은 경우 "제출 버튼"을 클릭하세요.
3 제출된 페이지에서 "돌아가기"를 클릭한 다음 "제출"을 클릭하세요.
2. 반복 제출이 아닌 경우: 양식을 제출한 페이지에서 "돌아가기"를 클릭한 다음 원래 양식 페이지를 "새로 고침"한 다음 "제출"을 클릭하세요.
3. 양식 제출:
양식에 표시를 하세요. 서블릿에 제출할 때 태그가 존재하는지, 미리 정의된 태그와 일치하는지 확인하세요. 일치하면 요청이 수락되고 태그가 삭제됩니다. 일관성이 없거나 태그가 없는 경우 프롬프트 메시지에 직접 응답합니다: "Duplicate submit"
① 해결 방법 1: 숨겨진 필드를 하나만 제공: , 불가능, 이유: //표시 지우기: 고정된 요청 매개변수를 지울 방법이 없습니다
index.jsp
1 <body> 2 <% 3 request.setAttribute("token", "tokenValue"); 4 5 %> 6 7 <form action="<%= request.getContextPath() %>/tokenServlet" method="post"> 8 9 <input type="hidden" name="token" value="jason"/> 10 11 12 13 name:<input type="text" name="name"/> 14 <input type="submit" value="submit"/> 15 16 </form> 17 18 </body>
TokenServlet.java
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 3 String token = request.getParameter("token"); 4 if("jason".equals(token)){ 5 //清除标记:没有方法清除固定的请求参数 6 } 7 8 }
② 옵션 2: 요청에 태그를 넣으세요. 작동하지 않습니다. 양식 페이지가 새로 고쳐진 후에는 요청이 삭제되고 양식을 제출하면 새로운 요청이 되기 때문입니다.
index.jsp
1 <body> 2 <% 3 request.setAttribute("token", "tokenValue"); 4 %> 5 6 <form action="<%= request.getContextPath() %>/tokenServlet" method="post"> 7 8 <input type="hidden" name="token" /> 9 10 11 12 name:<input type="text" name="name"/> 13 <input type="submit" value="submit"/> 14 15 </form> 16 17 </body>
TokenServlet.java
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 Object token = request.getAttribute("token"); 3 4 if(token != null){ 5 //清除标记:没有方法清除固定的请求参数 6 }else{ 7 response.sendRedirect( request.getContextPath() + "/token/token.jsp"); 8 return; 9 10 } 11 }
③ 옵션 3: 태그를 세션.
숨겨진 필드를 사용하고 속성 도메인 값 설정 index.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ page import="java.util.*" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>避免表单的重复提交</title> 9 </head> 10 <body> 11 <% 12 13 String tokenValue = new Date().getTime() + ""; 14 session.setAttribute("token", tokenValue ); 15 %> 16 17 <form action="<%= request.getContextPath() %>/tokenServlet" method="post"> 18 <!-- 隐藏域 --> 19 <input type="hidden" name="token" value="<%= tokenValue %>"/> 20 21 22 23 name:<input type="text" name="name"/> 24 <input type="submit" value="submit"/> 25 26 </form> 27 28 </body> 29 </html>
TokenServlet.java
1 package com.jason.token.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 import javax.servlet.http.HttpSession; 11 12 13 @WebServlet("/tokenServlet") 14 public class TokenServlet extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 18 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 20 //1.获取session 21 HttpSession session = request.getSession(); 22 23 //2.获取设置好的属性域值 24 Object token = session.getAttribute("token"); 25 26 //3.获取隐藏域的值 27 String tokenValue = request.getParameter("token"); 28 29 //4.处理,若 token不为空,且token 和tokenValue相同 30 if(token != null && token.equals(tokenValue)){ 31 //5.去除标记 32 session.removeAttribute("token"); 33 }else{ 34 //6.重定向到提示页面 35 response.sendRedirect( request.getContextPath() + "/token/token.jsp"); 36 return; 37 } 38 //7.去除标记后,重定向到 成功页面 39 response.sendRedirect( request.getContextPath() + "/token/success.jsp"); 40 41 } 42 43 }
Success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h4>成功</h4> </body> </html>
token.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <h4> 重复提交了表单 </h4> 11 </body> 12 </html>
4. 요약
1) 무거운 지시된 방법은 양식 제출 문제의 일부를 해결할 수 있습니다.
2) 세션을 통해 속성 필드와 숨겨진 필드를 결합하여 양식의 반복 제출을 방지합니다.
관련 기사:
PHP 양식의 반복 제출, PHP 양식의 반복 제출 문제를 해결하는 방법 javascript - PHP는 새로 고침 페이지 양식의 반복 제출 문제를 어떻게 해결합니까?? JS 개발 확인 양식 튜토리얼위 내용은 Javaweb 학습 세션 사례: 반복되는 양식 제출을 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!