2

この投稿への簡単な質問は次のとおりです。

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では、scriptsディレクトリに「_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を構成する方法に関するドキュメントを教えてもらえますか?コンソールに出力しようとする以外に、コンテキストがnullである理由をトラブルシューティングする方法はありますか?

4

3 に答える 3

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"
} 
于 2012-09-27T11:11:54.897 に答える
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}"
}
于 2015-01-13T00:38:26.990 に答える