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

Posted

技术标签:

【中文标题】在 grails 控制器中识别 ajax 请求或浏览器请求【英文标题】:Identifying ajax request or browser request in grails controller 【发布时间】:2010-10-14 11:37:30 【问题描述】:

我正在开发一个使用大量 ajax 的 grails 应用程序。如果请求是 ajax 调用,那么它应该给出响应(这部分正在工作),但是如果我在浏览器中输入 URL,它应该带我回家/index 页面而不是请求的页面。下面是 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

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

【问题讨论】:

【参考方案1】:

在 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,我尝试了你的回答。我在引导初始化关闭中添加了第一部分。它给出了以下异常没有这样的属性:类的 HttpServletRequest:BootStrap:groovy.lang.MissingPropertyException:没有这样的属性:HttpServletRequest for class: BootStrap 你能帮帮我吗 请同时提供您的电子邮件地址 您需要在您的 BootStrap 类中导入 javax.servlet.http.HttpServletRequest 类。我将在答案中添加一个完整的示例。 非常感谢。那件小事并没有引起我的注意。 这是在 Grails 1.1 中添加的 - 所以如果您使用的是该版本或更高版本,那么您现在可以使用 request.xhr。【参考方案2】:

从 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
    
  

【讨论】:

【参考方案3】:

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

看起来您正在使用原型,它添加了X-Requested-With header set to 'XMLHttpRequest';检测到这可能是你最好的选择。

【讨论】:

以上是关于在 grails 控制器中识别 ajax 请求或浏览器请求的主要内容,如果未能解决你的问题,请参考以下文章

Grails spring security在向控制器操作发出ajax请求时出现403错误

从 grails 中的 gsp 页面进行 ajax 调用

Grails:运行ajax请求时用户注销

Grails:在服务器端检测请求中止(ajax,escape,reload)

Groovy Grails 处理控制器参数

Grails Spring Security - 会话超时后重新登录时重新加载会话变量