2009-09-20 43 views
22

我是Grails的新手,我很困扰很多简单的问题。如何重定向到Grails应用程序中上次访问的页面?

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

我最后一次尝试解决这个问题的方法是将参数$ {params.controller}和$ {params.action}保存到发送到注销操作的参数中,然后重定向。那么......即使这个失败了。 这里是普惠制片段:

<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')) 

但不幸的是,当登录后执行此操作时,我的页面中呈现的内容被复制。任何想法或任何其他安全解决方案?

回答

17

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

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

request.forwardURI是显示在浏览器的完整的URL,而request.contextPath是代表应用程序上下文中的URL部分,例如“http://localhost:8080/yourApp” - 因此,从正向URI移除上下文路径的结果是应用相对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编译器。

希望这会有所帮助。

+0

丹尼尔嗨, 非常感谢您为您的aswer。你帮了我很多! – fabien7474 2009-09-22 14:39:44

+0

@ daniel-rinser你的答案似乎只能通过一次刷新。你会如何建议处理如下: Page0->第1页 在表格W输入数据/错误 重定向回第1页与flash.errors 输入表单数据正确 应该得到重定向回页0 而是会发送到“/ 'as request.forwardURI()/ targetURI is“” – rik 2015-01-14 21:10:45

+1

为什么应用程序的相对URI?完整的Url有什么问题? – 2015-06-15 12:28:33

31

我使用此控制器侧:

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

+1。简单和容易。干杯。 :) – TheKojuEffect 2014-06-20 04:34:16

+0

很酷,谢谢! – 2014-10-28 09:02:49

+0

很有用,谢谢 – user615274 2016-09-26 19:21:56

0

另一种替代方法是使用当前与createLink建立的网址:actionNamecontrollerNameparams

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

由于absolute:true,这将创建绝对网址。

1

在GSP视图文件中,您可以直接使用。

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