Grailsアプリケーションのコントローラーの1つで、次のようにセッション変数のパラメーター値を保持しています。
session.myVariable = params.myValue
その後、アプリを積極的に使用している限り、さまざまなコントローラー/ GSPページから保存された値にアクセスできます。ただし、ブラウザウィンドウがまだ開いているにもかかわらず、しばらくアプリを使用しないと、セッション変数の値が失われます。
これは、セッションが期限切れになるために起こりますか?私は、ブラウザウィンドウがまだ開いているまでセッションが存続するという印象を受けていましたが、明らかに間違っていました。
Grailsアプリで定義したすべてのセッション変数が、ブラウザーを閉じるまで期限切れにならないようにするにはどうすればよいですか?セッションタイムアウトを手動で設定する方法はありますか?
回答ありがとうございます!
別のオプションはweb.xmlの変更です。事前に電話する必要があります
grails install-templates
次に、src/templates/war/web.xmlを編集し、サーブレットマッピング後に追加/変更します。
<session-config>
<session-timeout>60</session-timeout>
</session-config>
Session-timeoutの値は、単位として分を使用します。
数年早送り... Grails 3.0の場合、アプリケーション構成ファイルで ServerProperties を使用してセッションタイムアウトを設定します。
grails-app/conf/application.yml
_server:
session:
timeout: 3600 #seconds
_
デフォルト値:1800秒(30分)
getMaxInactiveInterval()
を使用して、コントローラーから HttpSession のタイムアウトを確認します。
_log.println "Timeout: ${session.getMaxInactiveInterval()} seconds"
_
出力->_Timeout: 3600 seconds
_
更新:Grails 3.1の変更の構成を編集
現在の杯(2.x)には、セッションタイムアウトを設定するための非常に奇妙な設計アプローチがあります。一般的なアイデアはどれも素晴らしいものではありません。
webxmlGrailsプラグイン内の「// session Timeout」セクションをコメントアウトし、Config.groovyに「sessionConfig.sessionTimeout =」を追加します。
grails install-templates、web.xmlからsession-timeoutを削除、WebXmlConfig.groovyにタイムアウトを追加
修正を待ちます。 :/
同僚が次のコードを思い付きました。これは私にとってはうまく機能し、実際のソリューションがgrailsコアに組み込まれるまでは機能します。
Config.groovyファイルの最後に次を追加し、適切なタイムアウトを設定します。
grails.war.resources = { stagingDir, args ->
def webXML = new Java.io.File("${stagingDir}/WEB-INF/web.xml")
webXML.text = webXML.text.replaceFirst("<session-timeout>30</session-timeout>", "<session-timeout>90</session-timeout>")
}
私の正しい解決策は、Config.groovyファイルで1行を許可することです。
session.timeout = 90;
乾杯。
Grails 3.1.xでは、セッションタイムアウトは非推奨です。 application.ymlの正しいプロパティは次のとおりです。
server:
session.timeout: 7200
ここに、より効果的なソリューションがあります。 grailsホームディレクトリに移動して、例:E:\ grails-2.3.8\src\war\WEB-INF\web3.0.template.xmlを見つけ、セッションタイムアウト値を目的の値に編集します。
例:enter code here
90
私は間違っている可能性がありますが、Grailsはアプリケーションコンテナに関連付けられたセッションを使用していると確信しています。たとえば、Tomcatを使用している場合、セッションの長さを指定できます。
Grails 3アプリケーションの場合、Application.groovy
私のために働いた:
package foo
import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import org.Apache.catalina.Context
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.Tomcat.TomcatContextCustomizer
import org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainerFactory
import org.springframework.context.annotation.Bean
class Application extends GrailsAutoConfiguration {
static void main(String[] args) {
GrailsApp.run(Application, args)
}
@Bean
EmbeddedServletContainerFactory containerFactory() {
TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory()
containerFactory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
void customize(Context context) {
int oneWeekInMinute = 7 * 24 * 60
context.setSessionTimeout(oneWeekInMinute)
}
});
return containerFactory
}
}