这里实现这个重复提交的防止,是通过在一个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 {
} }

      

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

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

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

  2. Java后台防止客户端重复请求、提交表单

    前言 在Web / App项目中,有一些请求或操作会对数据产生影响(比如新增.删除.修改),针对这类请求一般都需要做一些保护,以防止用户有意或无意的重复发起这样的请求导致的数据错乱. 常见处理方案 1 ...

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

    情况一: springmvc chrome jsonviewer 一起请求 重复提提交 controller重复执行 2次执行 Chrome浏览器地址栏访问接口url,重复请求问题解决   不论刷新还 ...

  4. ASP.NET WebApi服务接口如何防止重复请求实现HTTP幂等性

    一.背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi.在我们平时开发项目中可能会出现下面这些情况; 1).由于用户误操作,多次点击网页表单提交按钮.由于网速等原因造成页面卡顿,用户重复刷新 ...

  5. SpringCloud微服务实战——搭建企业级开发框架(三十九):使用Redis分布式锁(Redisson)+自定义注解+AOP实现微服务重复请求控制

      通常我们可以在前端通过防抖和节流来解决短时间内请求重复提交的问题,如果因网络问题.Nginx重试机制.微服务Feign重试机制或者用户故意绕过前端防抖和节流设置,直接频繁发起请求,都会导致系统防重 ...

  6. EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题

    问题控件:datagrid.combobox.所有能设置url属性的控件 问题版本:1.4.4.1.4.5(之前的版本没测) 问题如图: 重复请求2次,错误代码如图: 错误问题分析:html加载的时候 ...

  7. iOS不得姐项目--推荐关注模块(一个控制器控制两个tableView),数据重复请求的问题,分页数据的加载,上拉下拉刷新(MJRefresh)

    一.推荐关注模块(一个控制器控制两个tableView) -- 数据的显示 刚开始加载数据值得注意的有以下几点 导航控制器会自动调整scrollView的contentInset,最好是取消系统的设置 ...

  8. Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

  9. 比较两种方式的form请求提交

    [一]浏览器form表单提交 表单提交, 适用于浏览器提交.像常见的pc端的网银支付,用户在商户商城购买商品,支付时商家系统把交易数据通过form表单提交到三方支付网关,然后用户在三方网关页面完成支付 ...

随机推荐

  1. RequireJS 入门(二)

    简介 如今最常用的JavaScript库之一是RequireJS.最近我参与的每个项目,都用到了RequireJS,或者是我向它们推荐了增加RequireJS.在这篇文章中,我将描述RequireJS ...

  2. Django基础之简介(二)

    三板斧 from django.shortcuts import render,HttpResponse, redirect ​ HttpResponse # 返回字符串 urls: urlpatte ...

  3. express通过生成器

    express通过生成器 [ 脚手架 ] 1. 作用:可以帮助快速构建一个express项目 2. 脚手架的安装 全局安装 [可以使用npm cnpm] $ cnpm i express-genera ...

  4. vuex 使用实例

    官网:https://vuex.vuejs.org/zh/guide/state.html Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 1.vuex解决了组件之间同一状态的共享问题 ...

  5. ubuntu14彻底删除mysql!!!(精)

    解决方法: 删除mysql前 先删除一下 /var/lib/mysql 还有 /etc/mysql sudo rm /var/lib/mysql/ -R sudo rm /etc/mysql/ -R ...

  6. Invalid operator< assertion error解析

    这两天忙着在准备3月份打PAT考试,许久没有接触刷题了,各种生疏各种忘记,刷题速度那是一个慢,真是为自己智商着急.今天刷题碰到了一个有意思的编程习惯性错误,好几道题都涉及到自定义排序,需要自己重写&l ...

  7. alert(1) to win 16

  8. margin 和padding 的区别

    margin是用来隔开元素与元素的间距:padding是用来隔开元素与内容的间隔.margin用于布局分开元素使元素与元素互不相干: padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元 ...

  9. handy源码阅读(三):SafeQueue类

    SafeQueue类继承与信号量mutex(用于加锁),nonocopyable 定义如下: template <typename T> struct SafeQueue : privat ...

  10. python之路----操作系统的发展史

    阅读目录 手工操作 —— 穿孔卡片 批处理 —— 磁带存储和批处理系统 多道程序系统 分时系统 实时系统 通用操作系统 操作系统的进一步发展 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台 ...