2009-10-22 5 views
1

J'ai une action de contrôleur Grails qui est utilisée à des fins Ajax, même si vous pouvez toujours naviguer et afficher la page dans le navigateur.Rediriger l'utilisateur dans Grails si vous parcourez une action

class QuoteController { 

def quoteService 

/** 
* This page uses the ajaxRandom function defined below to display random quotes. 
*/ 
def random = { 
    def randomQuote = quoteService.getRandomQuote() 
    [quote:randomQuote] 
} 

/** 
* I do not want this to be a valid page, but maintain its use as a simple Ajax method. 
*/ 
def ajaxRandom = { 
    def randomQuote = quoteService.getRandomQuote() 
    response.outputStream << "<q>${randomQuote.content}</q><p>${randomQuote.author}</p>" 
} 
} 

Est-il possible de rediriger si quelqu'un visite l'URL via un navigateur tout en maintenant la fonctionnalité Ajax de la méthode à partir d'une page?

Répondre

2
def ajaxRandom = { 
    if(!request.xhr) { // this calls the dynamic method request.isXhr() 
     redirect action: 'random' 
    } else { 
     def randomQuote = quoteService.getRandomQuote() 
     response.outputStream << "<q>${randomQuote.content}</q><p>${randomQuote.author}</p>" 
    } 
} 

Cela fonctionne parce que la plupart des bibliothèques Ajax JS ajouter l'en-tête X-Requested-With à la demande. Grails ajoute dynamiquement cette méthode isXhr() à la classe HttpServletRequest.

// test whether the current request is an XHR request 
HttpServletRequest.metaClass.isXhr = {-> 
    'XMLHttpRequest' == delegate.getHeader('X-Requested-With')     
} 
+0

Cela a fonctionné parfaitement! Recommandez-vous des ressources pour plus de trucs et astuces comme celui-ci? –

0

Une méthode simple consiste à ajouter un paramètre à l'URL lorsque vous l'appelez via ajax, par ex. ? ajax = true

Ensuite, vérifiez la et rediriger si elle n'est pas là (comme quand une utilisation le frappe avec leur navigateur).

Si cela est trop facile à contourner, inspectez la requête pour voir ce qui est différent entre une requête de navigateur et une requête ajax.

acclamations

Lee

0

Si vous les requêtes AJAX sont toujours POTEAUX alors vous pouvez vérifier la méthode et présupposent un POST est un appel AJAX, car il est assez difficile pour l'utilisateur moyen de créer un poste accidentellement, où comme ils peuvent toujours obtenir une URL (s'ils le savent)

Espérons que cela aide.

Questions connexes