【问题标题】:Grails redirects to wrong address when using app.context?使用 app.context 时 Grails 重定向到错误的地址?
【发布时间】:2011-12-20 17:01:50
【问题描述】:

当我以某种方式设置我的app.context 时,我注意到redirect 的一些奇怪行为。我在 Grails JIRA 中发现了一个错误,它完美地描述了我的问题,但它被标记为 UTR:http://jira.grails.org/browse/GRAILS-7546


这是我对问题的描述:
我目前正在使用 Grails 2.0M2。我的 application.properties 文件中定义了以下属性:

app.context=/
app.name=foobar

当我在控制器中调用 redirect 时,redirect 正在将应用名称添加到我提供的 uri 中,这会导致 404。我是这样做的:

String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
redirect(uri: partialUrl) // INCORRECTLY redirects to 
                          // `http://mysite.com/foobar/hello/world`
                          // instead of `http://mysite.com/hello/world`

假设我在UrlMappings.groovy 文件中定义了一个名为helloworld 的URL 映射,其路径为/hello/world

所以,长话短说,如果我将app.context 设置为/,我不会期望app.name 会出现在我的最终重定向网址中。

这是一个错误还是预期的行为?关于无需执行太多手动步骤即可构建重定向 URL 的最简单方法的任何想法?

【问题讨论】:

    标签: java model-view-controller grails groovy


    【解决方案1】:
      def yourAction = {
    
           redirect(uri:"helloworld")
    
      }
    

    这对你不起作用?

    【讨论】:

      【解决方案2】:

      我不想这么说,但我也无法复制它。我使用一个控制器(名为 Hello)创建了一个测试项目,使用您的代码创建一个除了重定向之外什么都不做的操作:

      HelloController.groovy

      package test1
      
      class HelloController {
         def index() {
            def model = [:]
            model.content = 'content...'
            model
         }
      
         def redir() {
            String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
            redirect(uri: partialUrl) // INCORRECTLY redirects to 
                                  // `http://mysite.com/foobar/hello/world`
                                  // instead of `http://mysite.com/hello/world`
         }
      }
      

      我在views/hello中创建了一个索引页面index.gsp

      index.gsp

      <h1>index.gsp</h1>
      <html>
         <body>
            <p>This data is coming from the model:</p>
            <p>content: ${content}</p>
         </body>
      </html>
      

      在 UrlMappings 中设置 helloworld 以映射到 hello 控制器的索引操作:

      UrlMappings.groovy

      class UrlMappings {
          static mappings = {
              "/helloworld"(controller: "hello", action: "index")
      
              "/$controller/$action?/$id?"{
                  constraints {
                      // apply constraints here
                  }
              }
      
              "/"(view:"/index")
              "500"(view:'/error')
          }
      }
      

      并将 application.properties 更改为 app.context=/

      application.properties

      #Grails Metadata file
      #Sun Nov 06 14:51:56 EST 2011
      app.grails.version=2.0.0.RC1
      app.context=/
      app.name=test1
      app.servlet.version=2.5
      app.version=0.1
      

      当我运行应用程序时,我可以转到 localhost:8080/hello,它会显示我的简单 GSP。我尝试了 localhost:8080/helloworld 并且也按照映射的预期得到了它。然后我尝试了 localhost:8080/hello/redir 并正确重定向到 localhost:8080/helloworld。

      但是,如果您仍然面临这个问题,我有一些建议 1) 尝试使用 2.0 中可用的新链接生成器而不是 createLink。它可能没有什么不同,但值得一试:grailsLinkGenerator.link(mapping: 'helloworld') 2) 如果它只是来自控制器内的重定向,您可以自己将http://mysite.com 部分添加到partialUrl。 3) 最后,编写一个附加到 afterView 的过滤器,对 mysite.com/foobar 的内容进行正则表达式搜索和替换。虽然不确定这是否会捕获重定向,但如果有的话,我会假设就是这样,因为过滤器可以在广泛的层面上应用。

      【讨论】:

        【解决方案3】:

        这不是您问题的直接答案,但我的做法是:我从不修改 grails 属性中的 app.context,因为 tomcat 在生产中覆盖它,我不在乎它在我的开发中使用哪个上下文。

        【讨论】:

        • 对...Tomcat 可能会在生产环境中覆盖 app.context,但问题仍然是redirect Grails 在构建重定向 URL 时使用的是 app.name 而不是 app.context。
        猜你喜欢
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 2016-11-15
        • 1970-01-01
        相关资源
        最近更新 更多