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

StackOverflow https://stackoverflow.com/questions/665067

  •  21-08-2019
  •  | 
  •  

Вопрос

Я разрабатываю приложение grails, которое использует много ajax.Если запрос является вызовом ajax, то он должен выдать ответ (эта часть работает), однако, если я введу URL-адрес в браузере, он должен привести меня на домашнюю / индексную страницу вместо запрошенной страницы.Ниже приведен пример 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

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

Это было полезно?

Решение

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

Другие советы

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

def MyController {

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top