2009-03-20 9 views
17

リクエストがajaxコールの場合、リクエストを処理する必要があるgrailsアプリケーションを開発していますが、この部分は動作していますが、ブラウザは要求されたpage.Belowの代わりにhome/indexページに私を連れて行かなければならないが、ajax呼び出しのサンプルgspコードです。grailsコントローラでajaxリクエストまたはブラウザリクエストを識別する

<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

にリダイレクトする必要があります。

答えて

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-onlyのすべてのアクションにカスタムアノテーションを注釈した後、フィルタでこれを検証するというソリューションを構築しました。 Grailsのアプリ/ confに/ BootStrap.groovyの

全例:

import javax.servlet.http.HttpServletRequest 

class BootStrap { 

    def init = { servletContext -> 

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

    } 
    def destroy = { 
    } 
} 
+0

こんにちはジークフリート、私はあなたのanswer.Iは、ブートストラップのinit closure.Itで最初の部分を追加してみました次の例外 そのようなプロパティ与えている:クラスのためのHttpServletRequest: ブートストラップ: groovy.lang.MissingPropertyException:そのようなプロパティはありません:クラスのBootStrapのHttpServletRequest あなたは私を助けてください – DonX

+0

urメールアドレスを提供してください – DonX

+2

BootStrapクラスのjavax.servlet.http.HttpServletRequestクラスをインポートする必要があります。私は答えの完全な例を追加します。 –

3

通常の方法では、ajaxルーチンにヘッダーまたはクエリ文字列を要求に追加して検出させる方法があります。あなたがajaxのためにライブラリを使用しているなら、おそらくこれを提供しているでしょう。

プロトタイプを使用しているようですが、これにはX-Requested-With header set to 'XMLHttpRequest'が追加されています。おそらくあなたの最善の策であることを検出してください。

3

は、Grailsの1.1以来xhrプロパティは、AJAX要求を検出することができますrequestオブジェクトに追加されました。それの例は、使用です以下の通りです:

def MyController { 

    def myAction() { 
    if (request.xhr) { 
     // send response to AJAX request 
    } else { 
     // send response to non-AJAX request 
    } 
    } 
} 
関連する問題