代码之家  ›  专栏  ›  技术社区  ›  fabien7474 Jan Tchärmän

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

  •  25
  • fabien7474 Jan Tchärmän  · 技术社区  · 16 年前

    我是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>
    

    但我不太明白为什么…

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

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

    但不幸的是,在登录后执行此操作时,我的页面中呈现的内容是重复的。有什么想法或其他安全的解决办法吗?

    4 回复  |  直到 9 年前
        1
  •  17
  •   Daniel Rinser    16 年前

    重定向到最后一页的最简单方法是直接使用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)
    

    使用referer的afaik并不完全安全,因为这依赖于用户代理(浏览器)附加referer 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
  •  35
  •   nclu    12 年前

    我使用的是控制器端:

        redirect(uri: request.getHeader('referer') )
    
        3
  •  3
  •   elixir    9 年前

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

    <g:link url="${request.getHeader('referer')}"> Back </g:link>
    
        4
  •  0
  •   cweston Given    10 年前

    另一种选择是使用 createLink 使用电流: actionName ,请 controllerName params .

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

    这将创建一个绝对URL,因为 absolute:true .

    推荐文章