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

      

最新文章

  1. JavaWeb_day04搜索_乱码_路径_转发重定向_cookie
  2. SQL Server 2016 CTP2.2 安装手记
  3. Cats(2)- Free语法组合,Coproduct-ADT composition
  4. uploadify 自动访问url 初始化 自动请求
  5. 回朔法/KMP算法-查找字符串
  6. 通过github提升自己-测试反馈、持续精进
  7. 关于NRW算法(Quorum算法)
  8. CSS权威指南学习笔记系列(1)CSS和文档
  9. 求绝对值,hdu-2003
  10. 常用类库之.NET中的字符串
  11. java输入输出高速
  12. js常用API 数据类型 基本类型,基本包装类型,引用类型 Object String Array Boolean Number Date Math
  13. redhat+11g+rac 安装数据库软件时只有一个节点可选
  14. 一篇文章介绍GItHub的基础使用
  15. ios 容错处理JKDataHelper和AvoidCrash
  16. java8 Optional正确使用姿势
  17. Azure SQL Database (26) 使用Query Store对Azure SQL Database监控
  18. centos磁盘满了,查找大文件并清理
  19. Java注解 框架开发之Java注解的妙用
  20. java多线程实例(2)

热门文章

  1. Thinkphp 获取最大值id值
  2. [APIO2019] 奇怪装置
  3. 树莓派VNC Viewer 远程桌面配置教程
  4. ASE Alpha Sprint - backend scrum 9
  5. kali优化配置(2)
  6. Java基础学习(3)
  7. Sql Server 出现此数据库没有有效所有者问题
  8. Git分支操作步骤
  9. alert(1) to win 6
  10. AIX系统软件安装问题