您的位置:首页 > 编程语言 > Java开发

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

2017-01-20 00:43 288 查看
一、表单的重复提交:

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

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

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



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

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

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

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

> 若[b]一致,把session 中的Attribute 清除。[/b]

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



[b]三、源码演示:[/b]

[b]材料:[/b]

[b][b]WebContent/ Token/ Buy.jsp
[/b][/b]

[b]WebContent/ Token/ Buy_Finish.jsp[/b]

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>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: