当我以某种方式设置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
显示在我的最终重定向网址中。
这是一个错误还是预期的行为?我是否可以通过最简单的方法构建重定向网址,而无需执行太多手动步骤?
答案 0 :(得分:1)
我不想这么说,但我也无法重现它。我创建了一个带有一个控制器(名为Hello)的测试项目,使用您的代码创建一个除了重定向之外什么都不做的操作:
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<h1>index.gsp</h1>
<html>
<body>
<p>This data is coming from the model:</p>
<p>content: ${content}</p>
</body>
</html>
在UrlMappings中设置helloworld以映射到hello控制器的索引操作:
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 = /
#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上使用哪个上下文。