Перенаправить пользователя в Grails при просмотре действия - PullRequest
1 голос
/ 22 октября 2009

У меня есть действие контроллера 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 метода со страницы?

Ответы [ 3 ]

2 голосов
/ 22 октября 2009
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')                
}   
0 голосов
/ 22 октября 2009

Если ваши AJAX-запросы всегда являются POSTS, вы можете проверить метод и предположить, что POST - это вызов AJAX, поскольку обычному пользователю довольно сложно случайно создать POST, так как он всегда может получить любой URL (если он знает из этого)

Надеюсь, это поможет.

0 голосов
/ 22 октября 2009

Простой способ - добавить параметр в URL при вызове через ajax, например. ? Аякс = правда

Затем проверьте его и перенаправьте, если его там нет (например, когда пользователь попадает в браузер).

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

ура

Lee

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...