0

indexのアクションに移動していMyControllerます。ページ上のコードの一部はindex、AJAX コールバックをmyActionin に行っていMyControllerます。アクションが AJAX 呼び出しに JSON としてデータを返すことを期待myActionしているので、データ クライアント側で何かを行うことができますが、必要なようにデータを JSON として返すのではなく、データがテキストとして表示されます。

私の Grails コントローラーの例:

class MyController {
    def index() {
        render( view: "myView" )
    }

    def myAction {
        def mapOfStuff = [ "foo": "foo", "bar": "bar" ]
        render mapOfStuff as JSON
    }
}

私の JavaScript の例:

$( function() {
    function callMyAction() {
        $.ajax({
            dataType: 'json',
            url: base_url + '/myController/myAction',
            success: function( data ) {
                $(function() {
                    if( data.foo ) {
                        alert( data.foo );
                    }
                    if( data.bar ) {
                        alert( data.bar );
                    }
                });
            }
        });
    }
});

私が期待しているのは、ページがレンダリングされ、JavaScript が呼び出され、2 つのアラートが表示されることです。代わりに、JSON 配列がブラウザー ウィンドウにテキストとして表示されます。

{"foo":"foo","bar":"bar"}

この時点で、アドレス バーの URL の最後のセグメントは であり、ではmyActionありませんindex。ここで、インデックス ページの URL を手動で入力して更新を押すと、すべてが期待どおりに機能します。

まったく同じ方法で行う AJAX 呼び出しが半ダースありますが、どれも問題はありません。ここでの取引は何ですか?

更新#1:

私は何かに気づいた。のアクションにブレーク ポイントを設定し、そのindexアクションにMyController別のブレーク ポイントを設定すると、 に移動しているにもかかわらず、ログイン直後のブレーク ポイントの前にブレークmyActionポイントmyActionがヒットします。実際、アクションのブレークポイントに到達することはありません。これは明らかに私の問題の根本原因に近いですが、なぜそれが起こっているのですか?indexindexindex

更新#2:

Spring Security を使用していますが、デフォルトの URL を次のように設定しているにもかかわらず、...

grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/myController'

...「インデックス」アクションのブレークポイントは、MyControllerログイン時にヒットすることはありませんmyViewが、適切にレンダリングされます。コントローラーを経由せずにビューをロードできるようにするために、Spring Security はどのような黒魔術を行っていますか?

更新 #3:

この問題の解決策を見つけました。問題は、Spring Security がバックグラウンドで奇妙なことをしていたことです。したがって、次alwaysUseDefaultのように、構成に追加してtrueに設定しました。

grails.plugins.springsecurity.successHandler.alwaysUseDefault = true

ここで、期待どおりにブレークポイントがヒットする前に、indexアクションで設定されたブレークポイントをヒットします。残念ながら、ユーザーが別のページに移動しようとしても、ログイン後に常にリダイレクトされるため、このソリューションは最適ではありません。MyControllermyActiondefaultTargetUrl

このソリューションは私の問題を解決しますが、Spring Security がこのように設定された私にどのようにリダイレクトされたのかという疑問が生じdefaultTargetUrlます...

grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/myController'

... ?のindexアクションを経ずにMyController

4

3 に答える 3

1

使用してみてください:

def mapOfStuff = [ foo: "foo", bar:"bar"]

キーをGroovy文字列として使用する代わりに。

于 2012-10-15T22:47:34.957 に答える
1

IIRC、しないでくださいrender mapOfStuff as JSON、しかしreturn mapOfStuff as JSON。適切な content-type ヘッダーを応答に割り当てます。

render()Grails はそこにあるものを検出できないため、 としてStringレンダリングされるa を返す単なる関数です。タイプ OTOH は、適切なコンテンツ タイプでレンダリングされます。text/htmlJSON

于 2012-10-16T13:31:17.410 に答える
0

適切な応答ヘッダーを明示的に設定します。

render(contentType: "text/json") {  
  def mapOfStuff = [ "foo": "foo", "bar": "bar" ]
}
于 2015-01-17T13:06:13.887 に答える