在Grails控制器中识别Ajax请求或浏览器请求

17

我正在开发一个使用大量ajax的grails应用程序。如果请求是ajax调用,则应该给出响应(此部分有效),但是如果我在浏览器中键入URL,则它应该将我带到主页/索引页面而不是请求的页面。下面是ajax调用的示例gsp代码。

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

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

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

如何在控制器中验证这个重定向。

3个回答

34
很常见的做法是在 BootStrap.init 闭包中添加动态方法:
    HttpServletRequest.metaClass.isXhr = {->
         'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
    }

这允许您通过以下方式测试当前请求是否为ajax调用:

if(request.xhr) { ... }

最简单的解决方案是在您的“待办事项”操作中添加以下内容:
if(!request.xhr) { 
    redirect(controller: 'auth', action: 'index')
    return false
}

你也可以使用过滤器/拦截器。我曾经构建过一种解决方案,在其中用自定义注释对所有仅为ajax操作的动作进行了标注,然后在过滤器中进行验证。

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

嗨Siegfried,我尝试了您的答案。我将第一部分添加到引导程序初始化闭包中。它会给出以下异常BootStrap: groovy.lang.MissingPropertyException:类BootStrap没有此属性:HttpServletRequest - DonX
请提供您的电子邮件地址。 - DonX
2
您需要在BootStrap类中导入javax.servlet.http.HttpServletRequest类。我将在答案中添加一个完整的示例。 - Siegfried Puchbauer
非常感谢。那个小问题我没有注意到。 - DonX
16
如果您使用 Grails 1.1 或更高版本,则可以直接使用 request.xhr。这是在 Grails 1.1 中添加的。 - Chad Gorshing

7
自 Grails 1.1 版本起,request 对象添加了 xhr 属性,允许您检测 AJAX 请求。以下是其用法示例:
def MyController {

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

3
正常的方法是让ajax例程添加一个头部或查询字符串到请求中并检测它。如果你正在使用ajax库,它可能已经提供了这个功能。
看起来你正在使用prototype,它添加了一个X-Requested-With header set to 'XMLHttpRequest'; 检测它可能是你最好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接