如果浏览操作,则在Grails中重定向用户

时间:2009-10-22 02:50:58

标签: ajax grails redirect

我有一个用于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功能,是否有办法重定向?

3 个答案:

答案 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(如果他们知道它)

希望这有帮助。