17

多くの ajax を使用する grails アプリケーションを開発しています。リクエストが ajax 呼び出しの場合、応答が返されます (この部分は機能しています)。ただし、ブラウザーに URL を入力すると、ホーム/インデックス ページに移動する必要があります。以下は、ajax 呼び出しのサンプル gsp コードです。

<g:remoteFunction action="list" controller="todo" update="todo-ajax">

<div id ="todo-ajax">
//ajax call rendered in this area
</div>

ブラウザーの URL バーにhttp://localhost:8080/Dash/todo/listと入力すると、コントローラーはhttp://localhost:8080/Dash/auth/indexにリダイレクトする必要があります。

コントローラーでこれを検証する方法。

4

3 に答える 3

34

この動的メソッドを BootStrap.init クロージャーに追加することは、非常に一般的な方法です。

    HttpServletRequest.metaClass.isXhr = {->
         'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
    }

これにより、次のようにして、現在のリクエストが ajax 呼び出しであるかどうかをテストできます。

if(request.xhr) { ... }

最も簡単な解決策は、次のようなものを todo アクションに追加することです。

if(!request.xhr) { 
    redirect(controller: 'auth', action: 'index')
    return false
}

フィルター/インターセプターを使用することもできます。カスタム アノテーションで ajax 専用のすべてのアクションにアノテーションを付け、これをフィルターで検証するソリューションを構築しました。

grails-app/conf/BootStrap.groovy の完全な例:

import javax.servlet.http.HttpServletRequest

class BootStrap {

     def init = { servletContext ->

        HttpServletRequest.metaClass.isXhr = {->
            'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
        }

     }
     def destroy = {
     }
} 
于 2009-03-20T09:22:14.727 に答える
3

通常の方法では、ajax ルーチンでヘッダーまたはクエリ文字列をリクエストに追加し、それを検出します。ajax 用のライブラリを使用している場合は、おそらく既にこれが提供されています。

X-Requested-With ヘッダー セットを 'XMLHttpRequest' に追加するプロトタイプを使用しているようです。それを検出することがおそらくあなたの最善の策です。

于 2009-03-20T05:19:55.870 に答える