在一个使用了ssh的项目中,遇到了表单重复提交的问题。经过查找知道了struts中有对表单重复验证的方法,具体实现过程如下:
首先配置struts.xml配置文件:在所需要控制的表单对应的action下面加入token拦截器。代码如下:
<action name="contract" class="hl.contract.FContAction">
<interceptor-ref name="defaultStack"></interceptor-ref> //必须写
<interceptor-ref name="token">
<param name="includeMethods">activateCard</param> //includeMethods表示需要拦截的具体方法,excludeMethods表示不会拦截的方法,即不会进行重复提交验证
</interceptor-ref>
<result name="invalid.token">/public/dispatch/resubmitError.jsp</result> //struts验证返回的结果为invalid.token
<result name="success">/hl/contract/contractINFO.jsp</result>
</action>
以上XML片段值注意的是加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话token与请求token不一致时,将会直接返回“invalid.token”结果。
然后,再看看JSP的写法:
%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Struts 2 Cool Tags - <s:token/ ></title>
<s:head />
</head>
<body>
<h2><s:token/></h2>
<s:actionerror />
<s:form action="Token" >
<s:textfield name="message" label="Message" />
<s:token />
<s:submit />
</s:form>
</body>
</html>
加入<s:token />标志,注意该标签要放在<s:form>标签里面。
java程序在这里就不写了,就是正常的action类。
这样就实现了表单重复提交的验证功能。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
但是,由于我们项目中要求不能进行错误页面跳转,所以没有采用此方法。
而是使用了jQuery的方法,在提交表单后把“提交”功能禁掉,代码如下:
$("#msForm").on("submit", false); //msForm为表单的id.这句话就是把form表单的功能禁掉.