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

如何在控制器中验证这一点。

4

3 回答 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 = {
     }
} 
于 2009-03-20T09:22:14.727 回答
7

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

def MyController {

  def myAction() {
    if (request.xhr) {
      // send response to AJAX request  
    } else {
      // send response to non-AJAX request
    }
  }
}
于 2015-06-05T08:56:08.380 回答
3

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

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

于 2009-03-20T05:19:55.870 回答