本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

index.jsp 为表单提交的页面  TokenServlet.java 为表单提交的处理Servlet

1.重复提交情况:

  ① 在表单提交到一个 Servlet ,而 Servlet 又通过请求转发的方式响应了一个JSP(html) 页面,此时地址栏还保留着 Servelt 的路径。在响应页面点击 "刷新";

  ② 在响应页面没有达到浏览器时候点击 "提交按钮";

  ③ 在已经提交的页面中,点击 "返回" ,再点击 "提交";

2.不是重复提交的情况:在已经提交表单的页面,点击 "返回" ,再 "刷新" 原表单页面,再 "提交"

3.如何避免表单的重复提交:

    在表单中做一个标记,提交到 Servlet 时,检查标记是否存在且是否和预定义的标记一致
    若一致,则受理请求,并且销毁标记;
    若不一致,或没有标记,则直接响应提示信息:"重复提交"

① 方案一:仅提供一个隐藏域:<input type="hidden" name="token" value="jason"/> ,不可行,原因://清除标记:没有方法清除固定的请求参数

  index.jsp

 <body>
<%
request.setAttribute("token", "tokenValue"); %> <form action="<%= request.getContextPath() %>/tokenServlet" method="post"> <input type="hidden" name="token" value="jason"/> name:<input type="text" name="name"/>
<input type="submit" value="submit"/> </form> </body>

  TokenServlet.java

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

         String token = request.getParameter("token");
if("jason".equals(token)){
//清除标记:没有方法清除固定的请求参数
} }

② 方案二:把标记放入 request 中 , 行不通。因为表单页面刷新后,request 已经被销毁了,再提交表单是一个新的 request

  index.jsp

 <body>
<%
request.setAttribute("token", "tokenValue");
%> <form action="<%= request.getContextPath() %>/tokenServlet" method="post"> <input type="hidden" name="token" /> name:<input type="text" name="name"/>
<input type="submit" value="submit"/> </form> </body>

  TokenServlet.java

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object token = request.getAttribute("token"); if(token != null){
//清除标记:没有方法清除固定的请求参数
}else{
response.sendRedirect( request.getContextPath() + "/token/token.jsp");
return; }
}

③ 方案三:把标记放进 session 中。可以.通过 隐藏域设置属性域值 方式

  index.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!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>避免表单的重复提交</title>
</head>
<body>
<% String tokenValue = new Date().getTime() + "";
session.setAttribute("token", tokenValue );
%> <form action="<%= request.getContextPath() %>/tokenServlet" method="post">
<!-- 隐藏域 -->
<input type="hidden" name="token" value="<%= tokenValue %>"/> name:<input type="text" name="name"/>
<input type="submit" value="submit"/> </form> </body>
</html>

  TokenServlet.java

 package com.jason.token.servlet;

 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("/tokenServlet")
public class TokenServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取session
HttpSession session = request.getSession(); //2.获取设置好的属性域值
Object token = session.getAttribute("token"); //3.获取隐藏域的值
String tokenValue = request.getParameter("token"); //4.处理,若 token不为空,且token 和tokenValue相同
if(token != null && token.equals(tokenValue)){
//5.去除标记
session.removeAttribute("token");
}else{
//6.重定向到提示页面
response.sendRedirect( request.getContextPath() + "/token/token.jsp");
return;
}
//7.去除标记后,重定向到 成功页面
response.sendRedirect( request.getContextPath() + "/token/success.jsp"); } }

  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

 <%@ 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>

4.总结
  1)使用 重定向方式 可以解决一部分的表单提交问题。

  2)通过session 结合 属性域 与 隐藏域的方式 实现防止表单重复提交。

[原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交的更多相关文章

  1. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. java web解决表单重复提交问题

    我们大家再进行web开发的时候,必不可少会遇见表单重复提交问题.今天就来给总结如何解决表单提交问题,欢迎大家交流指正. 首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提 ...

  6. java web解决表单重复提交

    首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提交?2.什么情况下会出现表单重复提交?3.什么情况需要避免表单重复提交? 什么叫表单提交问题,说白了,就是同一份信息,重 ...

  7. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. 弹出窗口Session丢失、防止表单重复提交问题

    一.弹出窗口Session丢失问题 弹出窗口Session丢失使用window.showModalDialog进行信息的提示,相当方便,也容易控制外观和布局.但是存在一个严重的问题,就是Session ...

  9. [原创]java WEB学习笔记33:Session 案例 之 购物车

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. NSTimer注意内存泄露(真该死)

    NSTimer可以用来执行一些定时任务,比较常用的方法就是: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTar ...

  2. 转:HTTP ---HTTP头的编码问题(Content-Disposition)

    最近在做项目时遇到了一个 case :需要实现一个强制在浏览器中的下载功能(即强制让浏览器弹出下载对话框),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实 ...

  3. 配置YUM源更新源

    在虚拟机上更新yum,总是告诉我找不懂镜像服务器地址,配置失败,连 #yum install yum 它自己都无法更新. 于是决定先配置一下yum的更新源. 首先找到yum的主要配置文件, 一般在/e ...

  4. C# 系统应用之注冊表使用具体解释

    在平时做项目时,我们有时会遇到注冊表的操作,比如前面我们须要获取IE浏览器地址栏的信息.获取"我的电脑"地址栏输入的目录信息.USB近期使用信息等.注冊表项是注冊表的基本组织单位, ...

  5. Git--Bug解决篇

    Git--公司bug解决篇 作为程序员,我们时常遇到这样的场景,公司的产品上线了,程序员们美滋滋的开始开发新功能希望得到更多的流量.这时候,公司上线的产品发生了很严重的bug,可是我们已经在这个bug ...

  6. ANDROID常用的命令(转载,后续自己完善)

    1.adb devices:查看当前已连接的设备.2.adb shell:进入android的shell模式.3.echo 3>/proc/sys/vm/drop_caches:清除一下系统的c ...

  7. 机器学习2—K近邻算法学习笔记

    Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...

  8. Hibernate3中generator标签使用

    在XXX.hbm.xml映射配置文件中定义<generator class="native"/>标签是为了告诉Hibernate框架使用什么方式去生成主键class对应 ...

  9. Python修饰器的函数式编程(转)

    From:http://coolshell.cn/articles/11265.html 作者:陈皓 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Desi ...

  10. Linux 在不重启的情况下识别新挂载的磁盘

    在使用 Linux 时,有时候会因为初始时磁盘空间分配估计不足,使用中需要将挂载点扩容的情况,这就需要我们挂载新的磁盘.但是如果我们在 Linux 运行过程中挂载磁盘, Linux 又不能在不重启的情 ...