Pergunta

Estou desenvolvendo um aplicativo grails que utiliza grande quantidade de ajax.If o pedido é ajax chamada, então ele deve dar resposta (esta parte está trabalhando), no entanto, se eu digitar a URL no navegador que deve me levar para a casa / página de índice em vez do page.Below solicitado é o código gsp amostra para ajax chamada.

<g:remoteFunction action="list" controller="todo" update="todo-ajax">

<div id ="todo-ajax">
//ajax call rendered in this area
</div>

se digitar http: // localhost: 8080 / traço / todo lista / na barra de URL do navegador, o controlador deve redirecionar para http: // localhost: 8080 / traço / auth / index

Como validar isso no controlador.

Foi útil?

Solução

É uma prática bastante comum para adicionar este método dinâmico em seu fechamento BootStrap.init:

    HttpServletRequest.metaClass.isXhr = {->
         'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
    }

isso permite que você teste se o pedido atual é uma chamada de ajax fazendo:

if(request.xhr) { ... }

A solução mais simples é adicionar algo como isto a sua acção TODO:

if(!request.xhr) { 
    redirect(controller: 'auth', action: 'index')
    return false
}

Você também pode usar filtros / interceptores. Eu construí uma solução onde eu anotado todas as ações que são ajax somente com uma anotação personalizada, e depois validado isso em um filtro.

exemplo Cheio de grails-app / conf / BootStrap.groovy:

import javax.servlet.http.HttpServletRequest

class BootStrap {

     def init = { servletContext ->

        HttpServletRequest.metaClass.isXhr = {->
            'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
        }

     }
     def destroy = {
     }
} 

Outras dicas

Desde Grails 1.1 uma propriedade xhr foi adicionado ao objeto request que lhe permite detectar solicitações de AJAX. Um exemplo disto é o uso é abaixo:

def MyController {

  def myAction() {
    if (request.xhr) {
      // send response to AJAX request  
    } else {
      // send response to non-AJAX request
    }
  }
}

O método normal é ter a rotina ajax adicionar um cabeçalho ou uma cadeia de consulta ao pedido e detectar isso. Se você estiver usando uma biblioteca para o ajax, provavelmente fornece isso já.

Parece que você está usando o protótipo, que acrescenta um X-Requested-Com conjunto de cabeçalho para 'XMLHttpRequest' ; detectar que é provavelmente a sua melhor aposta.

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