【问题标题】:How to redirect to the last visited page in Grails app?如何重定向到 Grails 应用程序中上次访问的页面?
【发布时间】:2010-11-29 21:28:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: grails redirect login


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      重定向到最后一页最简单的方法是直接使用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 编译器感到困惑。

      希望这会有所帮助。

      【讨论】:

      • 您好丹尼尔,非常感谢您的回答。你帮了我很多!
      • @daniel-rinser 您的答案似乎只能通过一次刷新。您建议如何处理以下问题: Page0->Page1 在表单中输入数据 w/errors 使用 flash.errors 重定向回 Page1 在表单中正确输入数据 应该重定向回 Page0 而是作为 request.forwardURI 发送到“/” ) / targetURI 是 ""
      • 为什么有应用程序的相对URI?完整的 Url 有什么问题?
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        另一种方法是使用 createLink 构建 URL,使用当前的:actionNamecontrollerNameparams

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

        这将创建一个绝对网址,因为absolute:true

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-10
          • 1970-01-01
          • 1970-01-01
          • 2011-08-07
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多