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

设置在Grails中嵌入Tomcat以遵循符号链接,tomcat,grails,Tomcat,Grails,这篇文章的简化问题是: 如何访问Grails中WEB-APP目录之外的文件 我有一个grails应用程序,它与另一个系统共享一些资源(图像)。所以我创建了一个指向新文件的符号链接。这些文件是由用户上传的,因此有意将它们放在web根目录之外 例如: /images/country_flags/ --> /some/directory/with/images/country_flags/ 因此,当tomcat请求图像时: /images/country_flags/flag1.png 它确

这篇文章的简化问题是:

如何访问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>
但是,我在控制台中得到以下输出:

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文件如下所示(注意上下文更改为“/”):


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

我找到了答案,但我不太明白它为什么有效。 我将上下文从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"
} 

这就是我在Grails 2.4.x上的工作原理:

在BuildConfig.groovy中:

grails.appName = appName;
(不确定如何访问app name。您也可以以类似方式添加app.context) 然后添加包含以下内容的脚本/_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}"
}

没有一个答案对我很有效,但托比亚的评论帮助我正确设置了ctx变量。最后,我只需编辑脚本/\u Events.groovy,如下所示:

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

鉴于这仅适用于嵌入式Tomcat(生产中使用的WAR必须以不同的方式进行配置,例如通过
web app/META-INF/Context.xml
),并且由于嵌入式Tomcat应该只有一个web应用程序,我发现这是可行的:
def ctx=Tomcat.host.findChildren()[0]
尽管我在第一次签出项目时应用程序没有启动仍然存在问题:我必须完全删除_Events.groovy,至少运行一次应用程序,然后我可以将事件放回,它将正常工作。您在哪里配置了此路径/某些/directory/带有/images/country\u标志
eventConfigureTomcat = { tomcat ->
    def ctx = tomcat.host.findChild("/${grailsSettings.config.grails.appName}")
    ctx.allowLinking = true
    println "Added symbolic link support for /${grailsSettings.config.grails.appName}"
}
eventConfigureTomcat = { tomcat ->
    def ctx = tomcat.host.findChildren()[0] 
    ctx.allowLinking = true
    println "Added symbolic link support for /${grailsSettings.config.grails.appName}"
}