JavaWeb防止用户的重复请求提交

  这里实现这个重复提交的防止,是通过在一个FIlter过滤器中生成一个令牌token,保存在Session域中,然后在对这个token加密得到ciphertext(密文),将密文保存在request域中。如果在login.jsp中的一个隐藏表单项中取得这个request域中的密文(ciphertext)。提交到一个LoginServlet,进行判断令牌是否匹配成功,成功的话,就到数据库中查询操作,否则的话就打出提示消息。这样的话,就不会导致每一个请求均去数据库进行查询,导致系统超负荷的工作,不至于导致进行不必要的工作。

  代码如下:

  FilterToken.java

package cn.geore.token;

import java.io.IOException;
import java.util.UUID;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class FilterToken implements Filter {

	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 取得token
		String token = uuid();
		// 将uuid加密,得到密文
		String ciphertext  = MD5AndSHAEncrypt.cipherKey("MD5", token);
		// 将生成的token保存在session中
		HttpServletRequest req = (HttpServletRequest) request;
		HttpSession session = req.getSession();
		session.setAttribute("token", token);
		// 将ciphertext保存在request域中
		request.setAttribute("ciphertext", ciphertext);
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}

	// 生成一个token
	private static String uuid() {
		return UUID.randomUUID().toString().replace("-", "").toUpperCase();
	}
}

  

  login.jsp

<body>
    <form action="<%=request.getContextPath() %>/LoginServlet" method="get">
    	<input type="text" name="discription" />    
    	<input type="hidden" name="ciphertext" value="${requestScope.ciphertext}">
    	<input type="submit" value="提交" />
    </form></body>

  LoginServlet.java

package cn.geore.token;

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 LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter pw = response.getWriter();
		String token = (String) request.getSession().getAttribute("token");
		// 对token进行加密,判断传来的参数是否为同一个token
		String ciphertext = request.getParameter("ciphertext");
		if (ciphertext != null && token != null) {
			if (ciphertext.equals(MD5AndSHAEncrypt.cipherKey(
					MD5AndSHAEncrypt.ENCRYPT_ALGORITHM_MD5, token))) {
				// 令牌正确匹配后,要将令牌从Session域中移除
				request.getSession().removeAttribute("token");
				pw.write("令牌正确,没有进行重复表单的提交");
			}
		}else {
			pw.write("您正在进行非法的访问");
		}
	}

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

}

      

时间: 2024-10-05 04:43:44

JavaWeb防止用户的重复请求提交的相关文章

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

转载自:http://blog.csdn.net/ye1992/article/details/42873219 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*" pag

springmvc chrome jsonviewer 一起请求 重复提提交 controller重复执行 2次执行

情况一: springmvc chrome jsonviewer 一起请求 重复提提交 controller重复执行 2次执行 Chrome浏览器地址栏访问接口url,重复请求问题解决 不论刷新还是地址栏回车都会重复请求两次接口,但是换Firefox浏览器就没有这个问题,命令行curl也是正常的,后来发现是Chrome浏览器Jsonview插件的原因导致的. 将图片中红色框内的勾去掉即可,如果选择了该项,那么浏览器会被强制重复发送一次HTTP请求来获取原始HTTP内容. 这跟springmvc框

微信页面注册时重复请求的问题

以下转载于同事空间日志,做个记录: 最近在微信端的开发当中发现微信浏览器会重复请求后台,搞的我是寝食难安,业务逻辑就是一用户注册逻辑,本地测试没问题,放生产上有时就会报"用户已存在"异常,开始以为是代码逻辑里有重复插入的逻辑,在我来来回回反反复复的看了n遍依然没有发现有重复插入的逻辑时,我又把注意力移到了jquery的ajax上,以为是jquery里ajax重复提交的,于是我改变ajax提交为普通的href连接,结果错误依然.这时我感觉很可能是尼玛微信的套路,最后用了一很勉强的办法暂时

在JavaWeb应用中对客户请求的异步处理

本文结合具体的范例,介绍如何在JavaWeb应用中对客户请求进行异步处理,在Servlet中进行文件上传.本文的参考书籍是<Tomcat与Java Web开发技术详解>第三版,作者:孙卫琴. 本文所用的软件版本为:Window10,JDK10,Tomcat9. 本文所涉及的源代码的下载网址为:http://www.javathinker.net/javaweb/upload-app.rar 在Servlet API 3.0版本之前,Servlet容器针对每个HTTP请求都会分配一个工作线程.即

spring boot 通过AOP防止API重复请求

实现思路 基于Spring Boot 2.x 自定义注解,用来标记是哪些API是需要监控是否重复请求 通过Spring AOP来切入到Controller层,进行监控 检验重复请求的Key:Token + ServletPath + SHA1RequestParas Token:用户登录时,生成的Token ServletPath:请求的Path SHA1RequestParas:将请求参数使用SHA-1散列算法加密 使用以上三个参数拼接的Key作为去判断是否重复请求 使用Redis存储Key,

Android(java)学习笔记210:采用post请求提交数据到服务器

1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的login.jsp代码,如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <%@ page language="java"

ASP.NET MVC的Ajax.ActionLink 的HttpMethod=&quot;Get&quot; 一个重复请求的BUG

这段时间使用BootStrap+Asp.net Mvc5开发项目,Ajax.ActionLink遇到一个重复提交的BUG,代码如下: 1 @model IList<WFModel.WF_Temp> 2 @{ 3 Layout = null; 4 } 5 6 <!DOCTYPE html> 7 8 <html> 9 <head> 10 <meta name="viewport" content="width=device-w

防止重复请求攻击

今天发现自己项目一个漏洞:先为一账户充值100元,然后瞬间发送10次提现请求(都是提现100,提现接口是有做余额不足校验的),其中大约有四五次都是成功的,剩下的会报余额不足.期望是,只有一次可以成功完成提现,分析到能部分请求能通过余额不足校验原因是,由于是瞬间发出的提现请求,这些请求中拿到的余额数据都是余额扣减之前的数据. 以上场景可以提炼出两个关键步骤: 查询余额并校验,select * from account where user_id = 123; 扣减余额并支付,update acco

要求当前用户不能审核自己提交的业务

如图为要实现的效果——当admin用户审核自己提交的业务时,给予提示.主要知识点在于怎么在jsp页面获取当前登录用户来和未操作栏的操作员比较 audit_search_jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!--导入系统用户类--> <%@ page import="com.bdxc.bean.xt