index
のアクションに移動していMyController
ます。ページ上のコードの一部はindex
、AJAX コールバックをmyAction
in に行ってい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
がヒットします。実際、アクションのブレークポイントに到達することはありません。これは明らかに私の問題の根本原因に近いですが、なぜそれが起こっているのですか?index
index
index
更新#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
アクションで設定されたブレークポイントをヒットします。残念ながら、ユーザーが別のページに移動しようとしても、ログイン後に常にリダイレクトされるため、このソリューションは最適ではありません。MyController
myAction
defaultTargetUrl
このソリューションは私の問題を解決しますが、Spring Security がこのように設定された私にどのようにリダイレクトされたのかという疑問が生じdefaultTargetUrl
ます...
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/myController'
... ?のindex
アクションを経ずにMyController