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:token
jQueryによる隠しフィールドのマニュアルを新しいトークンに更新する必要があります
もっと良い方法はありますか!
HOWTO do CSRF protection in Struts2 application for AJAX requestsでこの問題を見つけましたが、もっと良い方法があるのでしょうか? (これは非常に一般的な問題であり、Struts で管理されている必要があると思います)