Идентификация запроса ajax или запроса браузера в контроллере grails
Я разрабатываю приложение 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
Как проверить это в контроллере.
Ответы
Ответ 1
Это довольно распространенная практика, чтобы добавить этот динамический метод в ваше закрытие 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 = {
}
}
Ответ 2
Обычный метод заключается в том, чтобы процедура ajax добавляла в запрос заголовок или строку запроса и обнаруживала это. Если вы используете библиотеку для ajax, возможно, это уже есть.
Похоже, вы используете прототип, который добавляет заголовок X-Requested-With, установленный в "XMLHttpRequest" ; обнаружив, что это, вероятно, лучший выбор.
Ответ 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
}
}
}