> Java > java지도 시간 > 본문

Javaweb 학습 세션 사례: 반복되는 양식 제출을 해결하는 방법

php是最好的语言
풀어 주다: 2018-07-28 10:15:50
원래의
1674명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿