在grails控制器中识别ajax请求或浏览器请求

我正在开发一个使用大量ajax的grails应用程序。如果请求是ajax调用那么它应该给出响应(这部分工作),但是如果我在浏览器中键入URL它应该带我到home / index页面而不是请求的page.Below是ajax调用的示例gsp代码。

 
//ajax call rendered in this area

如果我们在浏览器URL栏中输入http:// localhost:8080 / Dash / todo / list ,控制器应重定向到http:// localhost:8080 / Dash / auth / index

如何在控制器中validation这一点。

在BootStrap.init闭包中添加此动态方法是一种常见做法:

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

这允许您通过执行以下操作来测试当前请求是否是ajax调用:

 if(request.xhr) { ... } 

最简单的解决方案是在你的todo动作中添加这样的东西:

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

您也可以使用filter/拦截器。 我已经构建了一个解决方案,其中我使用自定义注释对所有仅具有ajax的操作进行注释,然后在filter中对其进行validation。

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 = { } } 

常规方法是让ajax例程向请求添加标头或查询字符串并检测它。 如果你正在使用ajax的库,它可能已经提供了这个。

看起来你正在使用原型,它将X-Requested-With标头设置为’XMLHttpRequest’ ; 检测到这可能是你最好的选择。

从Grails 1.1开始, xhr属性被添加到request对象中,允许您检测AJAX请求。 它的用法示例如下:

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