如何重定向到Grails应用程序中的最后一个访问过的页面?

时间:2009-09-20 15:46:43

标签: grails redirect login

我是Grails的新手,我正在努力解决许多简单的问题。

例如,当我从页面顶部布局上显示的模板视图登录/注销时,我没有找到回到上次访问过的页面的正确方法。

我解决此问题的最后一次尝试是将$ {params.controller}和$ {params.action}保存在发送到注销操作的参数中,然后重定向。嗯......即使这样也失败了。 这是gsp片段:

<g:link controller="user" action="logout" params="[currentController: ${params.controller}, currentAction: ${params.action}]">Logout</g:link>

最后一行代码行抛出以下异常:

ERROR errors.GrailsExceptionResolver  - Error evaluating expression [[currentController: ${params.controller}, currentAction: ${params.action}]]

所以我的问题是:

1 - 如何在登录/注销操作后重新加载上次访问的页面?

2 - 为什么我的代码有例外?

谢谢

编辑: 关于问题#2,似乎以下代码正在运行:

<g:link controller="user" action="logout" params="[currentController: params.controller, currentAction: params.action]">Logout</g:link>

但我真的不明白原因......

EDIT2: 我还找到了重定向到上次访问页面的解决方案:

redirect(url: request.header('referer'))

但遗憾的是,在登录后执行此操作时,我页面中呈现的内容会重复。任何想法或任何其他安全的解决方案?

4 个答案:

答案 0 :(得分:35)

我正在使用这个控制器端:

    redirect(uri: request.getHeader('referer') )

答案 1 :(得分:17)

重定向到最后一页的最简单方法是直接使用URI:

<g:link controller="user" action="logout" params="[targetUri: (request.forwardURI - request.contextPath)]">Logout</g:link>

request.forwardURI是浏览器中显示的完整网址,而request.contextPath是表示应用程序上下文的网址部分,例如“http://localhost:8080/yourApp” - 因此,删除的结果来自前向URI的上下文路径是app相对URI,例如“/ mycontroller / myaction”)

在您的退出操作中,只需重定向到此URI:

def targetUri = params.targetUri ?: "/"
redirect(uri: targetUri)

AFAIK,使用引荐来源并不完全安全,因为这依赖于用户代理(浏览器)附加引用者HTTP标头(可能已被禁用)。

关于你的第二个问题: Grails自动将GSP中的列表或地图属性值解释为Groovy表达式。所以,这个

<g:link controller="user" action="logout" params="[currentController: params.controller, currentAction: params.action]">Logout</g:link>

相当于

<g:link controller="user" action="logout" params="${[currentController: params.controller, currentAction: params.action]}">Logout</g:link>

并在${...}中再次包装此表达式的部分似乎会混淆GSP编译器。

希望这有帮助。

答案 2 :(得分:3)

在GSP视图文件中,您可以这样使用。

<g:link url="${request.getHeader('referer')}"> Back </g:link>

答案 3 :(得分:0)

另一种方法是使用createLinkactionNamecontrollerName来构建包含params的网址。

<g:link controller="user" action="logout" params="[targetUri: createLink(controller: controllerName, action:actionName, params:params, absolute:true)]">Logout</g:link>

由于absolute:true

,这将创建一个绝对网址