17 Stimmen

Identifizierung von Ajax-Anfrage oder Browser-Anfrage in Grails-Controller

Ich entwickle eine Grails-Anwendung, die viel ajax.if die Anforderung ist ajax aufrufen, dann sollte es Antwort geben (dieser Teil funktioniert), aber wenn ich in der URL im Browser eingeben sollte es mich auf die Home/Index-Seite anstelle der angeforderten page.below ist die Probe gsp-Code für ajax aufrufen.

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

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

wenn wir eingeben http://localhost:8080/Dash/todo/list in der URL-Leiste des Browsers, sollte der Controller auf http://localhost:8080/Dash/auth/index

Wie kann dies im Controller validiert werden?

34voto

Siegfried Puchbauer Punkte 6511

Es ist eine gängige Praxis, diese dynamische Methode in die BootStrap.init-Schließung aufzunehmen:

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

Damit können Sie testen, ob die aktuelle Anfrage ein Ajax-Aufruf ist, indem Sie dies tun:

if(request.xhr) { ... }

Die einfachste Lösung ist, Ihrer ToDo-Aktion etwas wie das Folgende hinzuzufügen:

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

Sie können auch Filter/Abfangvorrichtungen verwenden. Ich habe eine Lösung gebaut, bei der ich alle Aktionen, die nur Ajax sind, mit einer benutzerdefinierten Anmerkung versehen habe, und diese dann in einem Filter validiert habe.

Vollständiges Beispiel für 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 Stimmen

Hallo Siegfried, ich habe versucht, mit Ihrer answer.I fügte ersten Teil in Bootstrap init closure.It ist gibt folgende Ausnahme keine solche Eigenschaft: HttpServletRequest für Klasse: BootStrap:groovy.lang.MissingPropertyException: Keine solche Eigenschaft:HttpServletRequest für Klasse: BootStrap Könnten Sie mir bitte helfen

0 Stimmen

Bitte geben Sie auch Ihre E-Mail Adresse an

2 Stimmen

Sie müssen die Klasse javax.servlet.http.HttpServletRequest in Ihre BootStrap-Klasse importieren. Ich werde der Antwort ein vollständiges Beispiel hinzufügen.

7voto

Dónal Punkte 180956

Seit Grails 1.1 und xhr wurde die Eigenschaft request Objekt, mit dem Sie AJAX-Anfragen erkennen können. Ein Beispiel für seine Verwendung finden Sie unten:

def MyController {

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

3voto

MarkusQ Punkte 21488

Normalerweise fügt die Ajax-Routine der Anfrage eine Kopfzeile oder einen Abfrage-String hinzu und erkennt dies. Wenn Sie eine Bibliothek für die Ajax-Routine verwenden, bietet sie dies wahrscheinlich bereits.

Es sieht so aus, als würden Sie den Prototyp verwenden, der eine X-Requested-With-Header auf 'XMLHttpRequest' gesetzt Das Aufspüren ist wahrscheinlich die beste Lösung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X