日常开发中,防表单重复提交是一项必须的工作

我们可以利用javascript防止表单重复提交,但是利用javascript防止表单重复提交会出现一个新的问题

因为某些用户可能会绕过script代码直接提交给服务器,这样就做不到防止表单重复提交了

所以我们要在服务器后端进行拦截

拦截的原理就是利用hidden这个隐藏域进行表单提交,并且hidden携带了服务器随机生成的字符串

我们可以把服务器端随机生成的字符串放入session作用域

这样,当我们进入servlet进行验证的时候就能取出我们随机生成的字符串

再和hidden提交过来的字符串进行比较

下面来看代码部分,首先是登录页面,我们需要进行一点处理,因为要生成一个随机字符串

我们利用servlet进行生成并且在jsp页面得到这个生成的随机字符串

看代码,这里利用TokenProsessor单例类生成

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random; import sun.misc.BASE64Encoder; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; @SuppressWarnings({ "serial", "restriction" })
public class FormServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
HttpSession session = request.getSession(); String token = TokenProcessor.getInstance().generateToken(); session.setAttribute("token", token); request.getRequestDispatcher("/index.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
this.doGet(request, response);
} } /**
* 设置成单例类,降低产生的随机数的重复概率
* @author Scorpion
*
*/
class TokenProcessor
{
private static TokenProcessor instance = new TokenProcessor(); private TokenProcessor(){} public static TokenProcessor getInstance()
{
return instance;
} @SuppressWarnings("restriction")
public String generateToken()
{
Random random = new Random();
String randomStr = System.currentTimeMillis() + random.nextInt(999999999) + "";
try
{
MessageDigest md = MessageDigest.getInstance("md5"); byte[] md5 = md.digest(randomStr.getBytes()); BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(md5); } catch (NoSuchAlgorithmException e)
{
throw new RuntimeException(e);
} } }

接下来跳转到jsp页面,下面是一个简单的表单,其中hidden中的value遍是我们生成的并且放到session作用域的随机字符串

<form action="/DoFormServlet" method="post">

    username:<input type="text" id="username" name="username"/></br>
password:<input type="password" id="password" name="password"/><br> <input type="hidden" value="${token}" id="token" name="token"/>
<input type="submit" value="submit"/>
</form>

表单提交后再把流程转到DoFormServlet

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; @SuppressWarnings("serial")
public class DoFormServlet extends HttpServlet
{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{ String username = req.getParameter("username"); resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); boolean b = isToken(req);
if(!b)
{
out.write("请不要重复提交表单");
return;
} req.getSession().removeAttribute("token"); out.write("欢迎你:" + username);
} private boolean isToken(HttpServletRequest req)
{
String client_token = req.getParameter("token");
if(client_token==null){
return false;
} String server_token = (String) req.getSession().getAttribute("token");
if(server_token==null){
return false;
} if(!client_token.equals(server_token)){
return false;
} return true;
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
this.doPost(req, resp);
}
}

至此,本例完成。。。

servlet防止表单重复提交的更多相关文章

  1. java web学习总结(十三) -------------------使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  2. token防止表单重复提交

    出现表单重复提交的三种情况: 一.服务器响应缓慢,用户多次点击提交按钮. 二.提交成功后刷新页面. 三.提交成功后返回表单页面再次点击提交. package com.jalja.token; impo ...

  3. JavaWeb防止表单重复提交(转载)

    转载自:http://blog.csdn.net/ye1992/article/details/42873219 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用 ...

  4. JavaWeb---总结(十三)使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  5. [Java拾遗五]使用Session防止表单重复提交

    申明:此文章属于转载, 转自博客: http://www.cnblogs.com/xdp-gacl/p/3859416.html在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没 ...

  6. java web 学习十三(使用session防止表单重复提交)

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  7. JavaWeb学习总结(十三)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  8. (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交

    如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...

  9. 使用Session防止表单重复提交

    本文出处:http://www.cnblogs.com/xdp-gacl/p/3859416.html 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以 ...

随机推荐

  1. 使用Nginx和uwsgi部署Flask项目

    前言   之前用Flask框架开发了一个Python的Web项目,使用Nginx和uWSGI部署起来感觉挺麻烦,过程中还因为对Flask框架的不熟悉,花了好长时间才把应用完全部署起来.下面分享部署成功 ...

  2. Node性能如何进行监控以及优化?

    一. 是什么 Node作为一门服务端语言,性能方面尤为重要,其衡量指标一般有如下: CPU 内存 I/O 网络 CPU 主要分成了两部分: CPU负载:在某个时间段内,占用以及等待CPU的进程总数 C ...

  3. 基于SSM小区物业管理系统

    随着计算机的不断发展和广泛应用,人们的工作效率得到不断的提高.互联网的发展,更是缩短了人们之间的距离.如何充分利用互联网,这是大家共同关心的问题.本文主要介绍了关于小区管理系统的实现方法,设计规划了小 ...

  4. Redis学习——简介

    一.Redis简介 Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).hash(哈希).list(列表). ...

  5. Redis中一个String类型引发的惨案

    ​      曾经看到这么一个案例,有一个团队需要开发一个图片存储系统,要求这个系统能快速记录图片ID和图片存储对象ID,同时还需要能够根据图片的ID快速找到图片存储对象ID.我们假设用10位数来表示 ...

  6. java垃圾回收机制学习总结

    最近学习了一下java垃圾回收机制,将其主要内容大致总结一下: 1.什么是垃圾回收机制 java GC机制(garbage collection,垃圾收集,垃圾回收),是java特有的机制,作为jav ...

  7. jstack 命令使用经验总结

    jstack 命令的基本使用 jstack 在命令使用上十分简洁, 其信息量与复杂度主要体如今 thread dump 内容的分析上;web # 最基本的使用sudo -u xxx jstack {v ...

  8. S01-晓亮的电脑软件安装过程文档 腾讯QQ 595076941 2019年10月

    S01-晓亮的电脑软件安装过程文档 腾讯QQ 595076941 2019年10月 本文档的创建作者的腾讯QQ聊天号码是 595076941 S02-电脑软件安装过程中不要随意关闭窗口除非必需关闭窗口 ...

  9. Java预科:DOS命令及电脑快捷键

    Java预科:DOS命令及电脑快捷键 1.快捷键 常用快捷键 a/t +f4关闭窗口 cmd窗口打开快捷方式 1.开始+系统+命令提示符 2.win+r 输入cmd 3.在任意文件夹下面,按住shif ...

  10. 关于document.write()方法重绘页面问题

    学习的时候,document.write()被告知是用来将内容写进页面里面,同时也被告知document.write()方法会重绘页面,但是关于什么时候会重绘,什么时候不会重绘页面没有太多解释. 首先 ...