我想使用ajax提交表单。为此,我使用Jquery AjaxForm插件。表单包含文件和一些需要使用AJAX提交到struts2操作的数据。第一次表单提交正确,我收到错误消息,预计作为我和做一些服务器端验证。但是当我提交第二次表格并提供正确信息的表格时,表格没有提交给行动。
我已经搜索了这个问题,我开始知道它是由于我正在使用的令牌,因为第二次令牌值未达到匹配。
我如何解决此问题或我可以更新表单标记值的一些命中。
Code Sample:
<s:form id="uploadForm" name="uploadForm" action="usrUploadFormat" method="post" validate="true" enctype="multipart/form-data" autocomplete="off">
<div class="fields-format-wraper ulb-upload-wrapper">
<div class="error-wrapper">
<s:fielderror/>
<s:actionerror/>
<ul class='errorMessage passwdError' id="errors">
</ul>
</div>
<div class="fields-row" style="display: none;">
<div class="doc-check-wrapper">
<s:token/>
</div>
</div>
<div class="fields-row" id="doc-field">
<span><s:label cssClass="label" value="Upload*"/></span>
<span><s:file cssClass="inputFields inputs format file" id="formatToUpload" name="formatToUpload" accept="application/ms-excel,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"></s:file> </span>
</div>
<div class="fields-row formats-row btn-upload-wrapper">
<span style="float:left;margin-left: 175px;"><input type="button" class="btn-submit" value="Upload" name="auth" id="upload-now"/></span>
</div>
</div>
</s:form>
Ajax调用表单:
var options = {
success: function(msg)
{
var msgs = msg.split(":");
if(msgs.length>0){
if(msgs[0] == "Error"){
$('.errorMessage.passwdError').empty();
var counter = 0;
$.each( msgs, function( key, value ) {
counter++;
if(counter == 1)
return;
$('.errorMessage.passwdError').append("<li>"+value+"</li>");
});
window.parent.jQuery.fancybox.hideLoading();
} else{
alert(msgs[0]);
}
}
},
error: function(err)
{
jAlert("unable to upload file.",
'Upload Report Format Error.',
function (r) {
if(r == true){
window.parent.location.reload();
window.parent.jQuery.fancybox.close();
}
});
},
beforeSubmit: function(arr, $form, options) {
window.parent.jQuery.fancybox.showLoading();
}
};
$("#uploadReportFormatsForm").ajaxForm(options);
struts.xml中
<interceptor-stack name="pmidcCSRFStack">
<interceptor-ref name="tokenSession">
<param name="includeMethods">*</param>
</interceptor-ref>
<interceptor-ref name="dataSourceCheck"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
<action name="usrUploadFormat" class="com.org.pmidc.action.ULB_UploadReport">
<interceptor-ref name="pmidcCSRFStack"/>
<result name="invalid.token" type="tiles">csrfError</result>
<interceptor-ref name="i18n"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">application/pdf,application/ms-excel,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document</param>
<param name="maximumSize">1048576000000</param>
</interceptor-ref>
</action>
当我提交带有服务器端错误的表单时,如选择错误的格式pdf,或者文件大小大于允许,那么我将得到错误大小或文件格式是不允许的。一旦我纠正了所有错误并再次提交表单,那么请求不会转到执行操作,而是从令牌拦截器返回响应。我开始知道这是因为警告显示令牌不匹配时的日志。
这意味着很明显表单没有使用令牌提交到期错误。所以解决方案是更新令牌值,这里我卡住了。如何在下次提交表单时更新或刷新令牌值。