当前位置: 首页 > news >正文

杭州网站模板建站免费发布友链

杭州网站模板建站,免费发布友链,小程序源码怎么运行,小说网站做编辑器引发表单重复提交的一些场景: 网络延时 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单&#xff…

引发表单重复提交的一些场景:

网络延时

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

重新刷新

表单提交后用户点击【刷新】按钮导致表单重复提交

点击浏览器的【后退】按钮回退到表单页面后进行再次提交

用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交

 

场景模拟

创建一个form.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Form表单</title></head><body><form action="${pageContext.request.contextPath}/DoFormServlet" method="post">用户名:<input type="text" name="userName"><input type="submit" value="提交" id="submit"></form></body>
</html>

 

@WebServlet("/DoFormServlet")
public class DoFormServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");String userName = req.getParameter("userName");try {//模拟网络延迟Thread.sleep(300);} catch (Exception e) {}System.out.println("往数据库插入数据...."+userName);resp.getWriter().write("success");}}

 

发现在点击多次"提交按钮"、刷新页面、回退到表单时产生了多次提交的情况。

解决方案:

在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
  在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

  1. 存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
  2. 当前用户的Session中不存在Token(令牌)
  3. 用户提交的表单数据中没有Token(令牌)。 

注:有条件则使用redis代替session。

 

实现流程:

ToFormServlet(生成token放在session域)--->转发到form.jsp,隐藏域获取session中的token--->提交表单--->DoFormServlet(判断表单隐藏域的token和session中的token)

@WebServlet("/ToFormServlet")
public class ToFormServlet extends HttpServlet{protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.生成tokenString token = UUID.randomUUID().toString();//2.将token放入session域中req.getSession().setAttribute("formToken", token);//3.转发到form.jspreq.getRequestDispatcher("form.jsp").forward(req, resp);}
}

 

<form action="${pageContext.request.contextPath}/DoFormServlet" method="post">用户名:<input type="text" name="userName"><!-- 携带formToken  放在隐藏域,用于在DoFormServlet获取token--><input type="hidden" name="formToken" value="${formToken}"><input type="submit" value="提交" id="submit"></form>

 

@WebServlet("/DoFormServlet")
public class DoFormServlet extends HttpServlet {protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");//返回false,提交过了if(!isFlag(req)){resp.getWriter().print("you have already reported...");return;}String userName = req.getParameter("userName");try {Thread.sleep(300);} catch (Exception e) {}System.out.println("往数据库插入数据...." + userName);resp.getWriter().write("success");}/*** 返回flase的情况 1. 存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。 2.* 当前用户的Session中不存在Token(令牌)。 3. 用户提交的表单数据中没有Token(令牌)。* 当token与seesion中的formToken一致,返回true* * @return*/public boolean isFlag(HttpServletRequest request) {// 获取form.jsp传递过来的formTokenString token = request.getParameter("formToken");if (StringUtils.isBlank(token)) {// jsp页面中没有传递tokenSystem.out.println("token没有传递过来");return false;}// 获取session中的formTokenString formToken = (String) request.getSession().getAttribute("formToken");if (StringUtils.isBlank(formToken)) {System.out.println("session中的token已经被清空,请不要重复提交表单");}// 比较formToken和token是否一致,防止伪造tokenif (!token.equals(formToken)) {System.out.println("请不要伪造token...表单中的token:" + token + "   session中的formToken" + formToken);return false;}// 删除session中的tokenrequest.getSession().removeAttribute("formToken");return true;}}

改进:不要用session进行存储,把UUID生成的token存到redis中。使用redis进行存取,效率更高,稳定性高,资源占用更小。

 

如何防止模拟http请求?(CSRF)

Cross-site request forgery   跨站请求伪造

上面已经回答了这个问题,使用令牌,令牌具有唯一性,在完成一次请求后清空令牌,所以一个令牌只能有一次请求。

可是有些时候token被知道了,还是能模拟请求,那么就需要使用验证码。

所以,想要防止模拟http请求   token+验证码  

http://www.lbrq.cn/news/2779165.html

相关文章:

  • 网站的会员系统怎么做seo销售
  • 山东济南网站建设公司计算机基础培训机构
  • 西安做网站推广宣传推广网络推广
  • 微信编辑器做网站百度搜索竞价推广
  • 临朐网站建设定制首选哪家公司成都网络营销推广
  • 太原网站制作建设怎么自己建网站
  • 印江建设局网站百度搜索引擎盘搜搜
  • 大学生做兼职的网站有哪些站长网站大全
  • 手机网站营销的网站西安网站公司推广
  • 广东省建设信息网站企业网站建设公司
  • 专业建设网站哪家好百度快照是什么
  • 网站方案案例怎么做seo综合查询平台官网
  • 招工网站58同城朔州seo
  • 做网站什么科目宁波最好的seo外包
  • 好的网站建设天津seo管理平台
  • 手机app网站模板下载windows优化大师和鲁大师
  • 怎样能注册自己的网站网页制作工具有哪些
  • 北京网站建设怎么样天怎样创建一个网站
  • 二级域名指向 独立网站做网站推广一般多少钱
  • 如何建做校园购物网站肇庆网站建设制作
  • 做网站需要阿里云吗太原百度seo排名软件
  • 结合七牛云做视频网站福州关键词排名优化
  • 哪个网站专做民宿软件开发
  • 做网站的一些话术chatgpt 链接
  • 建设部电教中心网站seo自学网免费
  • wordpress内置播放器百度搜索seo
  • 中国进出口贸易官网网站建设优化哪家公司好
  • 营销网站建站公司转让如何进行app推广
  • 做教案找资料有哪些网站站长之家关键词查询
  • wordpress会员制网站自己开一个培训机构流程
  • 芯科科技即将重磅亮相IOTE 2025深圳物联网展,以全面的无线技术及生态覆盖赋能万物智联
  • 卸载win10/win11系统里导致磁盘故障的补丁
  • 【人工智能】2025年AI代理失控危机:构建安全壁垒,守护智能未来
  • 编程算法实例-Armstrong数(阿姆斯特朗数)
  • Git安装使用
  • FreeRTOS源码分析八:timer管理(一)