Перенаправлять пользователя в Grails при просмотре действия

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

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть действие контроллера 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 (если он знает этого)

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

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