我有一个用于Ajax目的的Grails控制器操作,尽管您仍然可以在浏览器中导航和查看页面。
class QuoteController {
def quoteService
/**
* This page uses the ajaxRandom function defined below to display random quotes.
*/
def random = {
def randomQuote = quoteService.getRandomQuote()
[quote:randomQuote]
}
/**
* I do not want this to be a valid page, but maintain its use as a simple Ajax method.
*/
def ajaxRandom = {
def randomQuote = quoteService.getRandomQuote()
response.outputStream << "<q>${randomQuote.content}</q><p>${randomQuote.author}</p>"
}
}
如果有人通过浏览器访问URL,同时在页面内维护方法的Ajax功能,是否有办法重定向?
答案 0 :(得分:2)
def ajaxRandom = {
if(!request.xhr) { // this calls the dynamic method request.isXhr()
redirect action: 'random'
} else {
def randomQuote = quoteService.getRandomQuote()
response.outputStream << "<q>${randomQuote.content}</q><p>${randomQuote.author}</p>"
}
}
这是有效的,因为大多数Ajax JS库都会在请求中添加X-Requested-With
标头。 Grails将此isXhr()
方法动态添加到HttpServletRequest类。
// test whether the current request is an XHR request
HttpServletRequest.metaClass.isXhr = {->
'XMLHttpRequest' == delegate.getHeader('X-Requested-With')
}
答案 1 :(得分:0)
一种简单的方法是在通过ajax调用url时将一个param附加到url,例如?AJAX =真
然后检查它并重定向,如果它不存在(例如当用户使用浏览器点击它时)。
如果这很容易解决,请检查请求以查看浏览器请求和ajax请求之间的不同之处。
欢呼声
利
答案 2 :(得分:0)
如果您的AJAX请求总是POSTS,那么您可以检查方法并假设POST是一个AJAX调用,因为普通用户很难意外创建POST,因为他们总是可以获取任何URL(如果他们知道它)
希望这有帮助。