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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top