我们希望避免在Struts 2基于Web的应用程序中通过Ajax发送的多请求。
s:token
可用于常规请求 - 响应jsp页面,但它不适用于ajax请求。
这是样本
应用程序具有使用ajax post方法验证字段的表单(我使用的是struts jquery插件,并且即时生成jQuery帖子)。
<s:form id="formValidateCustom" action="login">
<s:token/>
<s:textfield name="login" />
<span id="loginError">
<sj:submit button="true" validateFunction="customeValidation" />
</s:form>
登录操作如下:
@InterceptorRef("jsonValidationWorkflowStack")
@Validations(requiredStrings = {
@RequiredStringValidator(fieldName = "loginuser", type = ValidatorType.FIELD, message = "Login User is required")
})
public class Login extends ActionSupport {
@Action(value = "/login", results = {
@Result(location = "simpleecho.jsp", name = "success")
})
public String execute() throws Exception
{
echo = "Welcome " + login;
log.info(echo);
return SUCCESS;
}
}
有一个用于处理错误的自定义js。 Ajax调用结束时调用此函数。它读取所有错误并搜索名为field'Error'
的html字段,并将错误文本添加到其中:
function customeValidation(form, errors) {
if (errors.fieldErrors) {
$.each(errors.fieldErrors, function(index, value) {
var elem = $('#'+index+'Error');
if(elem)
{
elem.html(value[0]);
}
});
}
}
完整示例位于http://struts.jgeppert.com/struts2-jquery-showcase/index.action。请转到 Ajax&gt;表单&gt;自定义验证表单
当用户将登录字段留空时,ajax请求会返回错误,但表单中的令牌不会使用新令牌进行更新。这是因为没有再次执行,因为只进行了ajax调用,并且jsp没有完全加载。
我仍然可以使用Unable to implement Struts 2 token interceptor with hyperlink提供的解决方案。在我必须通过jQuery手动更新s:token
隐藏字段到新标记
有更好的方法!
我在HOWTO do CSRF protection in Struts2 application for AJAX requests发现了这个问题,但我想知道是否有更好的方法呢? (我认为这是一个非常普遍的问题,必须在struts中进行管理)