什么叫JavaWEB 开发表单的重复提交?如何避免重复提交s

一、表单的重复提交:

①. 在表单提交到一个Servlet ,而Servlet 又通过请求转发的方式响应一个JSP(HTML) 页面, 这个时候地址栏显示的是Servlet的路劲, 在刷新页面,这个时候会造成表单的重复提交。

②. 在响应页面没有到达时候重复点击“提交按钮”,会造成表单的重复提交。

③. 你在响应页面时候点击返回,在点击提交按钮的时候,会造成表单的重复提交。


二、如何避免表单的重复提交呢?

①. 在原表单生成一个随机值token 。

②. 在原表单把随机值token 放入session 和隐藏域(type="hidden")。

③. 在serlvet 中,获取session 跟隐藏域的值:

> 若一致,把session 中的Attribute 清除。

> 若不一致,直接重定向到提示页面,并且return 程序。


三、源码演示:

材料:

WebContent/ Token/ Buy.jsp

WebContent/ Token/ Buy_Finish.jsp

src/ sevlet/ Token_Servlet.java


Buy.jsp:

<%@page import="java.util.Date"%>
<%@ 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>

<%
//产出随机值 tokenval
String tokenVal = new Date().getTime()+"";

//将隐藏域放入session
session.setAttribute("tokenval", tokenVal);
%>

<h3>动漫城:</h3>
<form action="<%= request.getContextPath() %>/Token_Servlet" method="post">
<!-- 将随机值放入隐藏域 -->
<input type="hidden" name="token" value="<%= tokenVal%>"/>
<div>1.七龙珠<input type="checkbox" name="book" value="七龙珠"/></div><br>
<div>2.火影忍者<input type="checkbox" name="book" value="火影忍者"/></div><br>
<div>3.海贼王<input type="checkbox" name="book" value="海贼王"/></div><br>
<div>4.妖精的尾巴<input type="checkbox" name="book" value="妖精的尾巴"/></div><br>
<div>5.名侦探柯南<input type="checkbox" name="book" value="名侦探柯南"/></div><br>
<div><input type="submit" value="购买" /></div>
</form>
</body>
</html>


Token_Servlet.java:

package sevlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet("/Token_Servlet")
public class Token_Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
       
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
request.setCharacterEncoding("utf-8");
String books[] = request.getParameterValues("book");

HttpSession session = request.getSession();
session.setAttribute("books", books);

//获取随机值
Object token = session.getAttribute("tokenval");
String tokenval = request.getParameter("token");

//输出
System.out.println(token);
System.out.println(tokenval);

//判断获取的随机值跟session 的随机值是否一致
if(token != null && token.equals(tokenval))
{
session.removeAttribute("tokenval");
}else
{
response.sendRedirect(request.getContextPath()+"/Token/Token.jsp");
return;
}

//假设访问数据库的服务器
System.out.println("我访问了数据库的服务器");

response.sendRedirect(request.getContextPath()+"/Token/Buy_Finish.jsp");
}
}


Buy_Finish.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>
<%
String books[] = (String [])session.getAttribute("books");
%>

<h3>购买成功</h3><br>
<div>
购买物品:<%
for(String book:books)
{
out.print(book);
out.print("、");
}
%>
</div><br>
<a href="Buy.jsp"><strong>继续购买</strong></a>
</body>
</html>


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值