2009-03-20 7 views
17

Je suis en train de développer une application grails qui utilise beaucoup d'ajax.Si la requête est ajax call alors elle devrait donner une réponse (cette partie fonctionne), cependant si je tape l'URL dans le navigateur, il devrait me prendre à la page d'accueil/index au lieu de la page demandée. Ci-dessous est le code gsp échantillon pour l'appel ajax.Identification d'une requête ajax ou d'une requête de navigateur dans le contrôleur de grails

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

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

si nous tapons http://localhost:8080/Dash/todo/list dans la barre d'URL du navigateur, le contrôleur doit rediriger vers http://localhost:8080/Dash/auth/index

Comment valider ce dans le contrôleur.

Répondre

34

Il est tout à fait une pratique courante d'ajouter cette méthode dynamique dans votre fermeture BootStrap.init:

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

ce qui vous permet de tester si la demande actuelle est un appel ajax en faisant:

if(request.xhr) { ... } 

La solution la plus simple est d'ajouter quelque chose comme ceci à votre action todo:

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

Vous pourrait également utiliser des filtres/intercepteurs. J'ai construit une solution où j'ai annoté toutes les actions qui sont ajax seulement avec une annotation personnalisée, puis validée dans un filtre.

Exemple complet de 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 = { 
    } 
} 
+0

Salut Siegfried, j'ai essayé avec votre answer.I ajouté première partie dans bootstrap d'initialisation est closure.It donne suite exception Pas ces biens: HttpServletRequest pour la classe: BootStrap: groovy.lang.MissingPropertyException: Aucun bien: HttpServletRequest pour la classe: bootStrap pourrait u s'il vous plaît aidez-moi – DonX

+0

S'il vous plaît fournir ur adresse e-mail aussi – DonX

+2

Vous devez importer la classe javax.servlet.http.HttpServletRequest dans votre classe bootStrap. Je vais ajouter un exemple complet à la réponse. –

3

La méthode normale consiste à faire en sorte que la routine ajax ajoute un en-tête ou une chaîne de requête à la requête et la détecte. Si vous utilisez une bibliothèque pour l'ajax, cela est probablement déjà fourni.

Il semble que vous utilisez un prototype, qui ajoute un X-Requested-With header set to 'XMLHttpRequest'; détecter que c'est probablement votre meilleur pari.

3

Depuis Grails 1.1 une propriété xhr a été ajouté à l'objet request qui vous permet de détecter les requêtes AJAX. Un exemple de son usage est inférieure à:

def MyController { 

    def myAction() { 
    if (request.xhr) { 
     // send response to AJAX request 
    } else { 
     // send response to non-AJAX request 
    } 
    } 
} 
Questions connexes