0

Struts 2 Web ベースのアプリケーションで Ajax 経由で送信されるマルチリクエストを回避したいと考えています。

s:token通常のリクエスト/レスポンス JSP ページで使用できますが、ajax リクエストでは機能しません。

ここにサンプルがあります

アプリケーションには、ajax ポスト メソッドを使用してフィールドを検証するフォームがあります (私は 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 呼び出しが終了したときに呼び出されます。すべてのエラーを読み取り、名前が付けられた html フィールドを検索field'Error'して、エラー テキストを追加します。

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>フォーム>カスタム検証付きフォームに移動してください

ユーザーがログイン フィールドを空のままにすると、ajax リクエストはエラーを返しますが、フォーム内のトークンは新しいトークンで更新されません。これは、ajax 呼び出しが行われただけで、jsp が完全にロードされていないため、 が再度実行されないためです。

ハイパーリンクを使用して Struts 2 トークン インターセプターを実装できませんs:tokenjQueryによる隠しフィールドのマニュアルを新しいトークンに更新する必要があります

もっと良い方法はありますか!

HOWTO do CSRF protection in Struts2 application for AJAX requestsでこの問題を見つけましたが、もっと良い方法があるのでしょうか? (これは非常に一般的な問題であり、Struts で管理されている必要があると思います)

4

0 に答える 0