JAVA–利用Filter和session防止页面重复提交

解决思路:
1 用户访问表单页面,先经过过滤器,过滤器设置一个随机id作为token令牌, 并将该token放入表单隐藏域中.
2 表单响应到浏览器,用户填充数据后提交请求;
3 请求经过过滤器,过滤器获取表单中的令牌进行验证,如果和之前生成的令牌一致,则将请求放行,并且清空令牌;
4 如果用户重复提交表单,请求经过过滤器,过滤器进行验证.因为第一次放行后令牌已经清空失效,令牌不一致,不放行.跳转到提醒界面.

需用知识:
1 过滤器基础知识
2 servlet基础知识
3 filter基础知识
4 jsp基础知识

代码实现
1 jsp实现form表单页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><form action="login" method="post"><!-- 利用表单的隐藏域 保存token令牌 --><!--  ${token}等价于req.getsession().getAttribute("token")--><input type="hidden" name="token" value="${token}" />用户名:<input type="text" name="username"/><br/>密码:<input type="password" name="password"/><br/><input type="submit" value="login"/></form>
</body>
</html>

2 filter过滤器

package com.woniu.filter.controler;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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet Filter implementation class TokenFilte*///过滤所有servlet
@WebFilter("*")public class TokenFilte implements Filter {public TokenFilte() {// TODO Auto-generated constructor stub}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub//设置编码集request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charser=utr-8");//向下转型HttpServletRequest req=(HttpServletRequest) request;HttpServletResponse resp=(HttpServletResponse) response;//获取表单的tokenString parameterToken = req.getParameter("token");//获取session中的tokenString sessionToken = (String) req.getSession().getAttribute("token");//判断表单的token,不为空说明用户已经提交form表单,需要验证是否重复提交,//为空说明是第一次进入登录页面,需要设置tokenif (parameterToken!=null) {//判断两个令牌是否相等,相等则放行,并重置令牌if(parameterToken.equals(sessionToken)) {//重置令牌req.getSession().removeAttribute("token");chain.doFilter(request, response);}else {//说明是重复提交,转发到提示页面req.getRequestDispatcher("repeatReminder").forward(request, response);}}else {//第一次进来,需要设置令牌//生成宇宙唯一码String token = UUID.randomUUID().toString();//设置sessionreq.getSession().setAttribute("token",token);//放行chain.doFilter(request, response);}}@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub}}

3 表单响应的servlet
利用线程睡30秒,模拟网络拥堵

package com.woniu.filter.controler;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class PrintUser*/
@WebServlet("/login")
public class Login extends HttpServlet {private static final long serialVersionUID = 1L;public Login() {super();// TODO Auto-generated constructor stub}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try {//线程睡30秒,便于演示网络拥堵Thread.sleep(30000);response.getWriter().write("登录成功");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

4 重复提交时响应的servlet
重复提交时跳转到该提醒页面

package com.woniu.filter.controler;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class repeatReminder*/
@WebServlet("/repeatReminder")
public class repeatReminder extends HttpServlet {private static final long serialVersionUID = 1L;public repeatReminder() {super();// TODO Auto-generated constructor stub}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().write("页面正在处理,请勿重复提交");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

JAVA--利用Filter和session防止页面重复提交相关推荐

  1. 高薪程序员面试题精讲系列77之如何防止前端页面重复提交请求?

    一. 面试题及剖析 1. 今日面试题 如何防止前端页面重复提交请求? 如何防止重复提交请求? 2. 题目剖析 今天的面试问题,属于在考察我们应对具体问题时的解决思路和解决办法.这种针对具体业务.寻求解 ...

  2. 防止刷新或后退页面重复提交表单

    刷新或后退页面会引起重复提交表单,为了避免这个头疼的问题发生,有几种方法可以实现.网上已经有很多实现的方式的思路,比如提交后禁用按钮.重定向和令牌,但前两种方式有时候不起作用或者说没有"安全 ...

  3. 表单防止页面重复提交方法

    用户在操作表单数据时往往会出现表单数据重复提交的问题,尤其实在Web开发中此类问题比较常见.刷新页面,后退操作以前的页面,单机多次按钮都会导致数据重复提交.此类问题是因为浏览器重复提交HTTP请求导致 ...

  4. php 返回页面重复提交,php防止表单重复提交

    后端防止重复提交的基本原理: 服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面.当表单提交时会带上subToken,服务器获取表单信息判断ses ...

  5. 后台利用aop注解的方式防止重复提交

    1.建立标签:防止重复提交 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Avoi ...

  6. 【ASP.NET】 【防止连续多次点击提交按钮 导致页面重复提交】

    最近做项目遇到了这样的情况: 公司网络比平常慢了不少,在点击保存按钮提交页面后需等待挺长的一段时间,忍不住手贱点多了几次,当提交完成后发现数据库语句执行异常. 两种验证方式: 第1种: aspx页面按 ...

  7. java服务端实践:防止订单重复提交支付

    来源:cnblogs.com/cjsblog/p/14516909.html 概述 为了防止掉单,这里可以这样处理: 为了防止订单重复提交,可以这样处理: 附上微信支付最佳实践: 概述 如图是一个简化 ...

  8. ajax绑定事件页面重复提交,ajax防止用户重复提交点击事件

    防止ajax重复提交 提交 /** * 模拟ajax提交 * @fn 回调函数 * */ function Ajax(fn){ setTimeout(function(){ var data= {re ...

  9. 利用redis实现分布式请求防重复提交

    2019独角兽企业重金招聘Python工程师标准>>> 1.自定义注解类Token @Target(ElementType.METHOD) @Retention(RetentionP ...

最新文章

  1. java集合中对象某属性比较排序
  2. python使用matplotlib可视化阶梯图、使用step函数可视化阶梯图、可视化时间序列数据的波动周期和规律
  3. mysql self join_mysql self join的实现--left join 和inner join
  4. select使用css居右对齐
  5. Java 8发布一年后,IDE和编译器尚未完全就绪
  6. 物资管理系统c语言课程设计,C语言实现仓库物资管理系统
  7. BZOJ2819 Nim(DFS序)
  8. Android Studio apk 打包流程
  9. MySQL正则表达式的使用
  10. C++项目开发注意事项--持续更新
  11. lol自动刷人机辅助_LOL星籁歌姬新手怎么玩 星籁歌姬技能出装符文打法攻略 新英雄星籁歌姬辅助攻略...
  12. 精心整理的10套最美Web前端新年特效---提前祝大家新年快乐(文末送书)
  13. svg格式的中国地图轮廓图
  14. 基于OpenCV的多目标动态检测与跟踪
  15. 用Python物理建模的第一本书终于来啦
  16. 网站服务器iis7.5配置,IIS 7.5 配置伪静态
  17. 麒麟v10安装达梦数据库
  18. 小米路由器装linux,小米路由器3安装Misstar 从开始到失败
  19. python笑脸猫图案_酷叮猫编程课堂:python生成字符画
  20. 50个启发你灵感的黄色系网站设计

热门文章

  1. 蓝桥杯 ADV-201 算法提高 我们的征途是星辰大海
  2. AE 学习笔记(一)
  3. 制作支持View,图片轮播的Banner
  4. HTML之淘宝界面案例
  5. 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)
  6. 网页设计与网站规划 作业21 圣诞节壁纸制作
  7. Postman+Newman命令运行
  8. Stereogram(极射赤面)投影--主要用于中高纬和极区的天气图
  9. 计算机技能比赛范文,计算机基本技能大赛活动策划书范文
  10. 免费下载谷歌地球高清卫星影像和高程DEM教程