60

私の Grails アプリケーションのコントローラーの 1 つで、次のようにセッション変数にパラメーター値を保持しています。

session.myVariable = params.myValue

その後、アプリを積極的に使用している限り、さまざまなコントローラー/GSP ページから保存された値にアクセスできます。ただし、アプリをしばらく使用しないと、ブラウザー ウィンドウがまだ開いていても、セッション変数の値が失われます。

これは、セッションの有効期限が切れたために発生しますか? セッションはブラウザー ウィンドウがまだ開いている間は存続するという印象を受けましたが、どうやら私は間違っていたようです。

Grails アプリで定義したすべてのセッション変数が、ブラウザーを閉じるまで期限切れにならないようにするにはどうすればよいですか? セッションタイムアウトを手動で設定する方法はありますか?

回答ありがとうございます。

4

7 に答える 7

85

別のオプションは、web.xmlを変更することです。事前に電話する必要があります

grails install-templates

次に、src / templates / war / web.xmlを編集し、サーブレットマッピング後に追加/変更します。

<session-config>
   <session-timeout>60</session-timeout>
</session-config>

session-timeoutの値は、分を単位として使用します。

于 2010-05-25T20:12:48.133 に答える
42

数年早送りします... Grails 3.0の場合、アプリケーション構成ファイルのServerPropertiesでセッション タイムアウトを設定します。

grails-app/conf/application.yml

server:
   session:
      timeout: 3600  #seconds

デフォルト値: 1800秒 (30 分)

以下を使用して、コントローラーから のHttpSessionのタイムアウトを確認しgetMaxInactiveInterval()ます。

log.println "Timeout: ${session.getMaxInactiveInterval()} seconds"

出力 --> Timeout: 3600 seconds

更新: Grails 3.1 での変更に合わせて構成を編集

于 2015-06-16T07:51:16.413 に答える
7

現在の grails (2.x) は、セッション タイムアウトを設定するための非常に奇妙な設計アプローチを採用しています。有力なアイデアはどれも素晴らしいものではありません。

  1. WebxmlGrails プラグイン内の「//session Timeout」セクションをコメントアウトし、「sessionConfig.sessionTimeout=」を Config.groovy に追加します。

  2. grails install-templates、web.xml から session-timeout を削除、WebXmlConfig.groovy にタイムアウトを追加

  3. 修正を待ちます。:/

同僚が次のコードを思いつきました。これは私にとってはうまく機能し、実際のソリューションが 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;

乾杯。

于 2013-08-28T17:03:55.627 に答える
2

Grails 3.1.x では、session-timeout は非推奨になりました。application.ymlの正しいプロパティは次のとおりです。

server:
    session.timeout: 7200
于 2016-07-28T13:39:43.510 に答える
1

私は間違っているかもしれませんが、Grails はアプリケーション コンテナーに関連付けられたセッションを使用していると確信しています。たとえば、Tomcat を使用している場合は、セッションの長さを指定できます。

Tomcat セッションの長さを変更するためのチュートリアル。

于 2010-05-25T18:49:23.883 に答える
0

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
    }

}
于 2016-11-02T14:25:25.867 に答える