• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JSP > jsp实现客户端服务端防止用户重复提交表单

jsp实现客户端服务端防止用户重复提交表单

作者:m0_37505412 字体:[增加 减小] 来源:互联网 时间:2017-09-12

m0_37505412通过本文主要向大家介绍了jsp获取客户端ip,jsp获取客户端ip地址,jsp客户端跳转,客户端表单验证,表单大师客户端等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

当网络有延迟时,用户提交的表单等数据还没有完成此次提交,但用户又多次点击提交,造成用户数据在数据库或存储中被提交多次。
利用线程延迟,简单模拟重复提交。
表单页面为form.html
[html] view plain copy



form.html

 

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
<meta http-equiv="description" content="this is my page">  
<meta http-equiv="content-type" content="text/html; charset=UTF-8">  

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  

 



用户名 :


 

处理提交请求的servlet为DoFormServlet.java
[java] view plain copy
package SessionDemo;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DoFormServlet extends HttpServlet
{

public void doGet(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException  
{  
    String username = request.getParameter("username");  

    //利用线程休眠,模拟网络延迟  
    try  
    {  
        Thread.sleep(1000*3);  
    } catch (InterruptedException e)  
    {  
        e.printStackTrace();  
    }  
    System.out.println("向数据库中注册数据。");  
}  

public void doPost(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException  
{  
    doGet(request, response);  
}  

}
在浏览器中加载form.html

当用户反复点击“提交”时,就造成了重复提交。

二、解决方法一:利用javascript阻止
其他不变,将form.html修改为
[html] view plain copy



form.html

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
<meta http-equiv="description" content="this is my page">  
<meta http-equiv="content-type" content="text/html; charset=UTF-8">  

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  


var isCommitted = false;
function dosubmit()
{
if(!isCommitted)
{
isCommitted=true;
return true;
}
else
{
return false;
}
}




用户名 :




这样在浏览器中加载form.html后,点击“提交”,终端中只会输出一次”向数据库中注册数据。”,表明成功阻止表单反复提交。
以上form.html可以进一步优化,当用户点击“提交”后,“提交”按钮应该变为灰色不可用。
[html] view plain copy



form.html

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
<meta http-equiv="description" content="this is my page">  
<meta http-equiv="content-type" content="text/html; charset=UTF-8">  

<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  


function dosubmit()
{
var input = document.getElementById("submit");
input.disabled = 'disabled';
return true;
}




用户名 :




利用javascript的方法不能完全防止用户恶意重复提交,例如:用户可以将form.html保存后修改,还可以在点击“提交”后重复刷新页面,从而实现反复提交。
三、解决方法二:利用服务器端Session防止表单重复提交。
其中FormServlet.java为
[java] view plain copy
package SessionDemo;

import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class FormServlet extends HttpServlet
{

public void doGet(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException  
{  
    //产生随机数表单号  
    TokenProcessor tp = TokenProcessor.getInstance();  
    String token = tp.generateToken();  

    request.getSession().setAttribute("token",token);  
    request.getRequestDispatcher("/form.jsp").forward(request, response);  
}  

public void doPost(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException  
{  
    doGet(request, response);  
}  

}

//设计为单例模式
class TokenProcessor
{
private TokenProcessor(){};
private static final TokenProcessor instance = new TokenProcessor();

public static TokenProcessor getInstance()  
{  
    return instance;  
}  

public String generateToken()  
{  
    //获得随机数字符串  
    String token = System.currentTimeMillis() + new Random().nextInt() + "";  
    //获得数据摘要  
    try  
    {  
        MessageDigest md = MessageDigest.getInstance("md5");  
        byte[] md5 = md.digest(token.getBytes());  

        //利用base64编码防止乱码。  
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(md5);  
    } catch (NoSuchAlgorithmException e)  
    {  
        throw new RuntimeException(e);  
    }  
}  

}
添加form.jsp
[plain] view plain copy
<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8”%>




 




用户名




将DoFormServlet.java修改为
[java] view plain copy
package SessionDemo;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DoFormServlet extends HttpServlet
{

public void doGet(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException  
{  
    String username = request.getParameter("username");  

    boolean b = isTokenValue(request);  
    if (!b)  
    {  
        System.out.println("请不要重复提交。");  
        return;  
    }  

    request.getSession().removeAttribute("token");  
    System.out.println("向数据库中注册数据。");  
}  

//判断表单号是否有效  
private boolean isTokenValue(HttpServletRequest request)  
{  
    String clientToken = request.getParameter("token");  
    if(clientToken==null)  
    {  
        return false;  
    }  

    String serverToken = (String) request.getSession().getAttribute("token");  
    if(serverToken==null)  
    {  
        return false;  
    }  

    if (!clientToken.equals(serverToken))  
    {  
        return false;  
    }  

    return true;  
}  

public void doPost(HttpServletRequest request, HttpServletResponse response)  
        throws ServletException, IOException  
{  
    doGet(request, response);  
}  

}
再浏览器中加载FormServlet

点击“提交”后跳转

终端显示用户提交

这时即使用户点击“刷新”,也不能实现重复提交。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • jsp实现客户端服务端防止用户重复提交表单
  • jsp获取客户端IP地址的方法
  • JSP如何获取客户端真实IP地址
  • JSP中实现判断客户端手机类型并跳转到app下载页面
  • JSP 获取真实IP地址的代码
  • 使用JSP读取客户端信息

相关文章

  • 2017-05-11ssh项目环境搭建步骤(web项目)
  • 2017-05-11Java Web项目前端规范(采用命名空间使js深度解耦合)
  • 2017-05-11JAVA/JSP学习系列之一(JDK安装)
  • 2017-05-11jsp输出当前时间的实现代码
  • 2017-05-11jsp中定义和使用方法示例介绍
  • 2017-05-11jsp+ajax发送GET请求的方法
  • 2017-05-11JDBC板块精华整理20051226
  • 2017-05-11十二、脚本元素、指令和预定义变量
  • 2017-05-11jsp获取url路径的方法分析
  • 2017-05-11jsp页面获取服务器时间的简单调用示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • JSP 2.1和JSF 1.2规范发布预览版本
    • Linux 下java jps命令使用解析详解
    • 浅析Java中Data类的应用
    • jsp传参 servlet接收中文乱码问题的解决方法
    • 三、第一个Servlet
    • JSP 获取Spring 注入对象示例
    • jsp中page指令用法详解
    • Jquery、Ajax、Struts2完成定时刷新的方法
    • 初学jsp心得
    • jsp实现点击help打开chm文件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有