Идентификация запроса ajax или запроса браузера в контроллере grails

17

Я разрабатываю приложение 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>

, если мы наберем Ссылка в строке URL-адреса браузера, контроллер должен перенаправить на Ссылка

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

    
задан DonX 20.03.2009 в 06:16
источник

3 ответа

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-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 = {
     }
} 
    
ответ дан Siegfried Puchbauer 20.03.2009 в 10:22
источник
  • Привет Siegfried, я попробовал с вашим ответом. Я добавил первую часть в bootstrap init shut.It дает следующее исключение Нет такого свойства: HttpServletRequest для класса: BootStrap: groovy.lang.MissingPropertyException: Нет такого свойства: HttpServletRequest для класса: BootStrap Не могли бы вы помочь мне? –  DonX 12.04.2009 в 05:07
  • Пожалуйста, укажите адрес электронной почты ur –  DonX 12.04.2009 в 05:09
  • Вам необходимо импортировать класс javax.servlet.http.HttpServletRequest в ваш класс BootStrap. Я добавлю полный пример ответа. –  Siegfried Puchbauer 12.04.2009 в 21:34
  • Большое спасибо. Этот маленький вопрос не ударил меня. –  DonX 13.04.2009 в 10:00
  • Это было добавлено в Grails 1.1 - поэтому, если вы используете эту версию или больше, вы можете просто использовать request.xhr сейчас. –  Chad Gorshing 15.06.2010 в 15:51
3

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

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

    
ответ дан MarkusQ 20.03.2009 в 06:19
источник
3

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

def MyController {

  def myAction() {
    if (request.xhr) {
      // send response to AJAX request  
    } else {
      // send response to non-AJAX request
    }
  }
}
    
ответ дан Dónal 05.06.2015 в 10:56
источник