Struts2使用Token避免表单重复提交(十三)下

简介: Struts2使用Token避免表单重复提交(十三)

三. 方法运行时间过长导致的问题


你以为只是改成一个type值就万事大吉了吗?你太天真了。


如果添加add()这个方法运行的时候够长的话,仍然会有一些错误的。


实际情况中,add()这个方法会执行很多的逻辑验证,并不是只改变一个表,所以运行时间可能会长。


用Thread线程的睡眠来模拟这种情况。


三.一 在 add() 方法中,添加延迟处理


在add()方法中添加一个休眠的处理:


public String add(){
  try {
    Thread.sleep(5000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  logger.info("执行添加学生的操作");
  return "toList";
}


三.二 重启服务器,再次验证


重启服务器,进行相应的验证:


点击一次添加后,浏览器在转圈,用户非常有可能再点一次,那么就会产生这种情况:


20200609122329386.png


很明显,执行了两次添加学生的操作。 这样,在展示数据的时候,就会展示两条, 而用户明明只添加了一条。


这是非常不可行的。


以前由于添加时时间短,没有发现这个问题。现在发现了,必须要去除。


Struts2框架提供了拦截器,来避免这一点


四. 利用 tokenSession 拦截器 防止表单提交


这种方法是在用户要提交的表单中,加入一个<s:token>标签,这样,当浏览器第一次访问这个带有<s:token>标签的页面时,


在服务器中,解析<s:token>标签的类(TokenTag.class),会生成一个随机的字符串(这个字符串,查看网页的源代码可以看到),


并且发送给客户端的浏览器,同时,在服务器中,会把这个随机字符串保存到用户的session对象中。


当第一次提交表单时,在服务器中,会比较客户端和服务器中分别保存的这个随机字符串,因为是第一次提交,所以这两个字符串相等,


然后进行正常的业务处理。第一次提交后,在服务器中的session中保存的这个随机字符串,会改变为其他的随机值,注意,这是很重要的一步!


此时,地址栏停留在处理用户提交数据的Action中,客户端中保存的随机字符串没有改变,若是刷新页面,


即重复提交,服务器再进行两个字符串的比较,会不相等,就会跳转到name为invalid.token的结果页面中,这样就会防止表单重复提交了。


(摘录于hackerain前辈的博客:https://blog.csdn.net/hackerain/article/details/6990121)


四.一 在 add.jsp 表单中添加<s:token/>


在add.jsp页面添加<s:token></s:token>


<body>
  <h3>这是一个添加学生的页面</h3>
  <s:form action="User_add" method="post" namespace="/">
    <!-- 添加一个token -->
    <s:token></s:token>
    <s:textfield label="姓名" name="name"></s:textfield>
    <s:submit value="添加学生"/>
  </s:form>
</body>


Struts2中已经实际上token的操作,将其转成了一个拦截器。在package包下引用这个拦截器即可。


四.二 配置struts.xml文件


<package name="user" namespace="/" extends="struts-default">
    <action name="User_*" class="com.yjl.web.action.UserAction" method="{1}">
      <interceptor-ref name="tokenSession">
        <!-- token对哪些方法起作用 -->
        <param name="includeMethods">add,edit,delete</param>
      </interceptor-ref>
      <interceptor-ref name="defaultStack"></interceptor-ref>
      <result name="addUI">/WEB-INF/content/add.jsp</result>
      <result name="editUI">/WEB-INF/content/edit.jsp</result>
      <result name="list">/WEB-INF/content/list.jsp</result>
      <!-- 应该当添加成功之后,就跳转到List界面 -->
      <result name="toList" type="redirectAction">User_list</result>
    </action>
</package>


四.三 重启服务器,进行验证Token


输入网址: http://localhost:8080/Struts_Token/User_list.action


输入姓名后, 正常点击一次添加学生的按钮:


20200609122346513.png


发现正常的跳转和使用。


点击两次或者多次添加学生的按钮时:


20200609122400510.png


添加学生的操作也只添加了一次。


进行修改的话,多次点击,也是只修改一次。


完成正常的逻辑和功能操作。


本章节的代码链接为:


链接:https://pan.baidu.com/s/1lo58hZkgq9K0uyyMZLnGmg 
提取码:09hl


谢谢您的观看!!!

相关文章
|
1月前
|
NoSQL Java API
SpringBoot项目中防止表单重复提交的两种方法(自定义注解解决API接口幂等设计和重定向)
SpringBoot项目中防止表单重复提交的两种方法(自定义注解解决API接口幂等设计和重定向)
127 0
|
设计模式 JavaScript 数据库
表单防止重复提交的四种方式
表单防止重复提交的四种方式
202 0
|
前端开发 Java 数据安全/隐私保护
3-SpringSecurity:自定义Form表单
3-SpringSecurity:自定义Form表单
126 0
3-SpringSecurity:自定义Form表单
|
前端开发
Struts2使用Token避免表单重复提交(十三)上
Struts2使用Token避免表单重复提交(十三)
Struts2使用Token避免表单重复提交(十三)上
|
存储 Java
初识 JSP---(Cookie / 重写URL / 防止表单重复提交)
Cookie Cookie是servlet发送到web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器, cookie一般用来保存session的id的会话。
1609 0