Перенаправлять пользователя в Grails при просмотре действия
Вопрос
У меня есть действие контроллера Grails, которое используется для целей Ajax, хотя вы все равно можете перемещаться и просматривать страницу в браузере.
class QuoteController {
def quoteService
/**
* This page uses the ajaxRandom function defined below to display random quotes.
*/
def random = {
def randomQuote = quoteService.getRandomQuote()
[quote:randomQuote]
}
/**
* I do not want this to be a valid page, but maintain its use as a simple Ajax method.
*/
def ajaxRandom = {
def randomQuote = quoteService.getRandomQuote()
response.outputStream << "<q>${randomQuote.content}</q><p>${randomQuote.author}</p>"
}
}
Есть ли способ перенаправить, если кто-то посещает URL-адрес через браузер, сохраняя функциональность Ajax метода изнутри страницы?
Решение
def ajaxRandom = {
if(!request.xhr) { // this calls the dynamic method request.isXhr()
redirect action: 'random'
} else {
def randomQuote = quoteService.getRandomQuote()
response.outputStream << "<q>${randomQuote.content}</q><p>${randomQuote.author}</p>"
}
}
Это работает, потому что большинство библиотек Ajax JS добавляют в запрос заголовок X-Requested-With
. Grails динамически добавляет этот метод isXhr ()
в класс HttpServletRequest.
// test whether the current request is an XHR request
HttpServletRequest.metaClass.isXhr = {->
'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
}
Другие советы
Простой способ - добавить параметр к URL-адресу при вызове его через ajax, например?ajax=истина
Затем проверьте его и перенаправьте, если его там нет (например, когда пользователь нажимает на него в своем браузере).
Если это слишком легко обойти, проверьте запрос, чтобы увидеть, чем отличается запрос браузера от запроса ajax.
ваше здоровье
Ли
Если ваши AJAX-запросы всегда являются POSTS, вы можете проверить метод и предположить, что POST - это вызов AJAX, поскольку обычному пользователю довольно сложно случайно создать POST, так как он всегда может получить любой URL (если он знает этого)
Надеюсь, это поможет.