使用app.context时,Grails重定向到错误的地址?

时间:2011-11-02 21:20:56

标签: java model-view-controller grails groovy

当我以某种方式设置redirect时,我注意到app.context的一些奇怪行为。我在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`

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

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

这是一个错误还是预期的行为?我是否可以通过最简单的方法构建重定向网址,而无需执行太多手动步骤?

3 个答案:

答案 0 :(得分:1)

我不想这么说,但我也无法重现它。我创建了一个带有一个控制器(名为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的内容。不确定这会捕获重定向,但如果有的话,我会假设这是因为过滤器可以广泛应用。

答案 1 :(得分:1)

  def yourAction = {

       redirect(uri:"helloworld")

  }

那对你不起作用?

答案 2 :(得分:0)

这不是你的问题的直接反映,但我的做法是:我从不修改grails属性中的app.context,因为tomcat在生产时覆盖它,我不关心它在我的dev上使用哪个上下文。