首页 > 代码库 > [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交
[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.概述
1)表单的重复提交
- 若刷新表单页面, 再提交表单不算重复提交
- 在不刷新表单页面的前提下:
- 多次点击提交按钮
- 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".
- 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)“
重复提交的缺点:
- 加重了服务器的负担
- 加重了服务器的负担
2.Strut2 解决表单的重复提交的方式:
1)在s:form 中添加 s:token 子标签
> 生成一个隐藏域
> 在session 添加一个属性值
> 隐藏域的值和session 的属性值是一致的
2)使用Token 或者 TokenSession 拦截器
> 这两个拦截器均不在默认的拦截器栈中,所以手工配置
> 若使用Token 拦截器,则需要配置一个Token.valid 的result
> 若使用TokenSession 拦截器,则不需要配置任何其他的result
3)Token vs TokenSession
> 都是解决表单重复提交的问题
> 使用Token 拦截器转到 token.valid 这个 result
> 使用tokenSession 拦截器,则还会响应那个目标页面,但,不会执行目标action 的方法。就像什么都没发生过一样。
4)可以使用s:actionerror 标签来显示重复提交表单的错误消息,该错误消息可以在国际化资源文件中被覆盖。该消息可以在 struts-messages.properties 文件中找到
struts.message.invalid.token = 自定义提示内容
token.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head>10 <body>11 12 <s:form action="testToken" >13 <s:token></s:token>14 <s:textfield name="userName" label="UserName"></s:textfield>15 16 <s:submit></s:submit>17 </s:form>18 19 20 </body>21 </html>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="default" namespace="/" extends="struts-default"><action name="testToken" class="com.jason.upload.app.TokenAction">
<!-- <interceptor-ref name="tokenSession"></interceptor-ref> -->
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref> <result>/success.jsp</result>
<result name="invalid.token">/token-error.jsp</result> </action></package></struts>
TokenAction.java
1 package com.jason.upload.app; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class TokenAction extends ActionSupport { 6 7 /** 8 * @Fields:serialVersionUID 9 */10 private static final long serialVersionUID = 1L;11 12 private String userName;13 14 public String getUserName() {15 return userName;16 }17 18 public void setUserName(String userName) {19 this.userName = userName;20 }21 22 @Override23 public String execute() throws Exception {24 25 Thread.sleep(2000);26 System.out.println(userName);27 return SUCCESS;28 }29 30 }
[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交