Идентификация ajax-запроса или запроса браузера в контроллере Grails - PullRequest
17 голосов
/ 20 марта 2009

Я разрабатываю приложение Grails, которое использует много ajax. Если запрос является вызовом ajax, то он должен дать ответ (эта часть работает), однако, если я наберу URL в браузере, он должен привести меня к дому / index страница вместо запрашиваемой страницы. Ниже приведен пример кода gsp для вызова ajax.

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

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

если мы введем http://localhost:8080/Dash/todo/list в строке URL браузера, контроллер должен перенаправить на http://localhost:8080/Dash/auth/index

Как проверить это в контроллере.

Ответы [ 3 ]

34 голосов
/ 20 марта 2009

Это довольно распространенная практика для добавления этого динамического метода в ваше закрытие 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 = {
     }
} 
4 голосов
/ 05 июня 2015

Начиная с Grails 1.1, к объекту request добавлено свойство xhr, которое позволяет обнаруживать запросы AJAX. Пример его использования ниже:

def MyController {

  def myAction() {
    if (request.xhr) {
      // send response to AJAX request  
    } else {
      // send response to non-AJAX request
    }
  }
}
3 голосов
/ 20 марта 2009

Обычный метод состоит в том, чтобы подпрограмма ajax добавила к запросу заголовок или строку запроса и обнаружила это. Если вы используете библиотеку для ajax, она, вероятно, уже обеспечивает это.

Похоже, вы используете прототип, который добавляет заголовок X-Requested-With, установленный в 'XMLHttpRequest' ; определить, что это, вероятно, ваша лучшая ставка.

...