在 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错误