1

ユーザー名、パスワード、およびキャプチャを含むサインイン ポップアップを含む 1 つのログイン ページがあります。ajax (戻り値は json ) を使用してフォームを投稿しようとするたびに、次のようなエラーが発生します。

com.opensymphony.xwork2.ognl.OgnlValueStack -'struts.token.name''[Ljava.lang.String;@53401791'ognl.OgnlException を持つ式の設定エラー:ソースが null の場合getProperty(null, "token")

フォーム トークン B4KX7L4ER1FXK5BRJZJ19QTGG4EGRGME がセッション トークン null と一致しません

ログイン.jsp

<script>
    var strutsToken = "<s:property value="#session['struts.tokens.token']" />";
</script>

と body タグの内側

<s:token/>

Signin.jsp (ログイン用ポップアップ)

<script>
    var strutsToken = "<s:property value="#session['struts.tokens.token']" />";
</script>

<script>
$(document).ready(function () {

    // For making new captcha image     
    var df = "Captcha?token=" + strutsToken + "&struts.token.name=token";      

    $("#IMA").attr("src", df);   // IMA is id of captcha image    

    $('#mini').click(function () {   // mini is id of submit button

        $.post('Auth', {
            username: document.getElementById('username').value,
            pass: document.getElementById('pass').value,
            Captcha: document.getElementById('Captcha').value,
            token: strutsToken,
            'struts.token.name': "token"
        }, function (jsonResponse) {
            if (jsonResponse.res == "1") {   
                console.log('valid');
                window.location = "campaign/campaign_dashboard.jsp";
            }
            else if (jsonResponse.res == "2") {   
                console.log('valid');
                window.location = "Main.jsp";
            } else {
                $('#result').text(jsonResponse.res);
            }
        }, 'json');
    });
});
</script>

Struts.xml

 <interceptor-stack name="myStack">
            <interceptor-ref name="authenticationInterceptor" >                                      </interceptor-ref>              
            <interceptor-ref name="cachingHeadersInterceptor" />
            <interceptor-ref name="fileUpload" >
            </interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            <interceptor-ref name="params">  
                <param name="params.excludeParams">
        token,dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*
    </param>  
            </interceptor-ref>  
            <interceptor-ref name="defaultStack"/>                                  
        </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="myStack"/>

トークンがアクションに正しく渡されるのを妨げているのは何ですか?

4

1 に答える 1

0

パラメーター インターセプターによってインターセプトされるトークン パラメーターからトークン パラメーターを除外する必要があります。

デフォルトでは、Parameters Interceptorはすでにそれらを除外しています:

このインターセプターは、excludeParams 属性を設定することにより、パラメーターを無視するように強制できます。この属性は、正規表現のコンマ区切りリストを受け入れます。これらの式のいずれかがパラメーターの名前と一致する場合、そのようなパラメーターはインターセプターによって無視されます。Struts によって定義されたインターセプター スタックは、いくつかのパラメーターを既に除外しています。

除外されるパラメータのデフォルト リスト

dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,
^servlet(Request|Response)\..*,parameters\...*

デフォルトで^struts\..*は、正規表現の一部は と を除外struts.tokenstruts.token.nameます。

元の除外されたパラメーターを拡張せずに、 Parameters Interceptor でデフォルトの除外されたパラメーターをオーバーライドした可能性があります。

それで:

  1. トークン パラメーターの除外を手動で追加します。

    <interceptor-ref name="params">  
        <param name="excludeParams">
            myStuff\..*,struts.token,struts.token.name
        </param>  
    </interceptor-ref>  
    
  2. または、はるかに優れているのは、カスタム除外を置き換えるのではなく、元のリストに追加することです

    <interceptor-ref name="params">  
        <param name="excludeParams">
            myStuff\..*,dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,
            ^servlet(Request|Response)\..*,parameters\...*
        </param>  
    </interceptor-ref>  
    

編集

コードを追加した後、いくつかのエラーが表示されます。

  1. remove myStuff\..*、実際のカスタマイズのプレースホルダーとして配置しましたが、必要ありません。
  2. 正規表現全体を 1 行に入れます。答えを読みやすくするためだけに分割しました。
  3. Parameters Interceptor で param 除外を設定してから、別の Parameters Interceptor を含む defaultStack 全体をインポートしています。defaultStack タグを開き、そこに除外を設定する必要があります (ただし、デフォルトの除外をオーバーライドしていないことを意味するため、これは問題の説明にはなりません...)。
  4. また、FileUpload Interceptor は既に defaultStack にあるため、2 回実行しています。

次に試してみてください:

<interceptor-stack name="myStack">
    <interceptor-ref name="authenticationInterceptor" />              
    <interceptor-ref name="cachingHeadersInterceptor" />
    <interceptor-ref name="token" />
    <interceptor-ref name="defaultStack" />
</interceptor-stack>

うまくいかない場合は、次を試してください。

<interceptor-stack name="myStack">
    <interceptor-ref name="authenticationInterceptor" />              
    <interceptor-ref name="cachingHeadersInterceptor" />
    <interceptor-ref name="token" />
    <interceptor-ref name="defaultStack">
        <param name="params.excludeParams">
            token,dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*
        </param>
    </interceptor-ref>
 </interceptor-stack>
于 2015-08-07T08:04:45.120 に答える