在Struts 2中防止Ajax多请求

时间:2013-09-25 19:57:28

标签: ajax struts2

我们希望避免在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中进行管理)

0 个答案:

没有答案