user redirecionamento no Grails se navegar uma ação
Pergunta
Eu tenho uma ação de controlador Grails que é usado para fins Ajax, embora você ainda pode navegar e visualizar a página no navegador.
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>"
}
}
Existe uma maneira de redirecionar Se alguém visitar o URL através de um navegador, mantendo a funcionalidade Ajax do método de dentro de uma página?
Solução
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>"
}
}
Isso funciona porque a maior parte do Ajax JS Bibliotecas adicionar o cabeçalho X-Requested-With
ao pedido. Grails adicionar este método isXhr()
dinamicamente para a classe HttpServletRequest.
// test whether the current request is an XHR request
HttpServletRequest.metaClass.isXhr = {->
'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
}
Outras dicas
Uma maneira simples é acrescentar um param para a url quando chamá-lo via ajax por exemplo ? Ajax = true
Em seguida, verifique para ele e redirecionamento se ele não estiver lá (como quando um uso acerta-lo com seu navegador).
Se isso é muito fácil de contornar, inspecionar o pedido para ver o que é diferente entre uma solicitação do navegador e uma solicitação ajax.
aplausos
Lee
Se você solicitações de AJAX são sempre POSTS então você poderia verificar o método e assumir um POST é uma chamada de AJAX porque é muito difícil para o usuário médio para criar um POST acidentalmente, onde, como eles sempre podem obter qualquer URL (se eles sabem dela)
Espero que isso ajude.