设置在Grails中嵌入Tomcat以遵循符号链接

时间:2012-09-27 10:22:39

标签: tomcat grails

这篇文章的简化问题是:

如何访问Grails中WEB-APP目录以外的文件?

我有一个grails应用程序,它与另一个系统有一些共享资源(图像)。所以我创建了一个指向新文件的符号链接。这些文件由用户上传,因此故意将它们放在Web根目录之外。

例如:

/images/country_flags/ --> /some/directory/with/images/country_flags/

所以当tomcat请求图片时:

/images/country_flags/flag1.png

真的是:

/some/directory/with/images/country_flags/flag1.png

我知道默认情况下Tomcat不支持符号链接,但可以通过在META-INF目录中创建一个context.xml文件来启用它,并提供以下信息:

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/images" allowLinking="true"></Context>

Grails允许通过在脚本目录中创建一个名为“_Events.groovy”的新文件来配置Tomcat。

从互联网上看,这应该可以解决问题:

eventConfigureTomcat = {tomcat ->
    println "Changing the configuration for tomcat"
    println serverContextPath

    def ctx=tomcat.host.findChild(serverContextPath) 
    ctx.allowLinking = true 
    println "Configuration changed"
} 

但是,我在控制台中获得以下输出:

Changing the configuration for tomcat
/
| Error Exception occurred trigger event [ConfigureTomcat]: Cannot set property 'allowLinking' on null object (Use --stacktrace to see the full trace)

我的application.properties文件如下(注意上下文更改为“/”):

#Grails Metadata file
#Wed Sep 26 09:56:39 BST 2012
app.context=/
app.grails.version=2.1.1
app.name=SomeCoolApp
app.version=0.1
plugins.google-visualization=0.5.3
plugins.mail=1.0
plugins.quartz=1.0-RC2
plugins.searchable=0.6.3
plugins.spring-security-core=1.2.7.3

这两种方法都不起作用。有人能指出我有关如何使用_Events.groovy方法配置Tomcat的文档。除了尝试打印到控制台之外,有没有办法解决为什么上下文为空?

3 个答案:

答案 0 :(得分:1)

我找到了答案,但我不太明白为什么会这样。 我将上下文从serverContextPath(返回/)更改为“”并且它可以正常工作。

eventConfigureTomcat = {tomcat ->
    println "Changing the configuration for tomcat"
    println serverContextPath

    def ctx=tomcat.host.findChild(serverContextPath) // doesn't work?
    def ctx=tomcat.host.findChild("") // works
    ctx.allowLinking = true 
    println "Configuration changed"
} 

答案 1 :(得分:1)

这对我在Grails 2.4.x上有用:

在BuildConfig.groovy中:

grails.appName = appName;

(不确定如何访问应用名称。您也可以以类似的方式添加app.context) 然后使用以下内容添加scripts / _Events.groovy:

eventConfigureTomcat = { tomcat ->
    def ctx = tomcat.host.findChild("/${grailsSettings.config.grails.appName}")
    ctx.allowLinking = true
    println "Added symbolic link support for /${grailsSettings.config.grails.appName}"
}

答案 2 :(得分:0)

没有一个答案对我有用,但Tobia的评论帮助我正确设置了ctx变量。最后,我只需编辑脚本/ _Events.groovy,如下所示:

eventConfigureTomcat = { tomcat ->
    def ctx = tomcat.host.findChildren()[0] 
    ctx.allowLinking = true
    println "Added symbolic link support for /${grailsSettings.config.grails.appName}"
}