我正在开发一个使用大量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
如何在控制器中对此进行验证。
在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 }
您也可以使用过滤器/拦截器。我建立了一个解决方案,其中我使用自定义注释来注释所有仅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 = { } }