如何在grails中的子域中进行相同的会话

时间:2012-05-27 13:32:49

标签: tomcat grails subdomain session-cookies

我有一个处理多个子域的应用程序,例如

  • sub1.domain.com
  • sub2.domain.com
  • www.domain.com
  • domain.com

用户可以在使用该应用时切换这些子域。发生这种情况时,不会在这些子域之间共享会话。我使用tomcat作为开发和生产的服务器。

我正在尝试让共享会话首先在开发中工作。在阅读时,发现在tomcat中实现这一目标的方法是:

<Context sessionCookiePath="/" sessionCookieDomain=".domain.com">

有没有办法可以在开发环境中的tomcat中设置它?

我在_Events.groovy中尝试了以下代码,但没有成功:

eventConfigureTomcat = {tomcat ->
    def context = tomcat.addContext("","/")
    context.setSessionCookieDomain(".domain.com")
    context.setSessionCookiePath("/")
}

我收到错误java.lang.IllegalArgumentException:addChild:子名称''不是唯一的

我认为我需要的是相当于下面的代码(由于没有getContext方法,因此无法工作):

eventConfigureTomcat = {tomcat ->
    def context = tomcat.getContext("") //This function does not exist
    context.setSessionCookieDomain(".domain.com")
    context.setSessionCookiePath("/")
}

有关如何在开发和生产中实现此功能的任何建议? 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

要访问默认的Tomcat上下文,您可能必须在插件的TomcatServer.groovy文件中修补TomcatServer的create方法。

TomcatServer(String basedir, String webXml, String contextPath, ClassLoader classLoader) {
    tomcat = new Tomcat()
this.buildSettings = BuildSettingsHolder.getSettings()  

    if(contextPath=='/') contextPath = ''

    def tomcatDir = new File("${buildSettings.projectWorkDir}/tomcat").absolutePath
    def ant = new AntBuilder()      
    ant.delete(dir:tomcatDir, failonerror:false)        

    tomcat.basedir = tomcatDir

    context = tomcat.addWebapp(contextPath, basedir) 
    // ** do additional context stuff here ** 
    tomcat.enableNaming()       

    // we handle reloading manually
    context.reloadable = false
    context.setAltDDName("${buildSettings.projectWorkDir}/resources/web.xml")

    def aliases = []
    def pluginManager = PluginManagerHolder.getPluginManager()
    def pluginSettings = GPU.getPluginBuildSettings()
    if(pluginManager!=null) {
        for(plugin in pluginManager.userPlugins) {
              def dir = pluginSettings.getPluginDirForName(GrailsNameUtils.getScriptName(plugin.name))
              def webappDir = dir ? new File("${dir.file.absolutePath}/web-app") : null
              if (webappDir?.exists())
                    aliases << "/plugins/${plugin.fileSystemName}=${webappDir.absolutePath}"
    }
}

    if(aliases) {
        context.setAliases(aliases.join(','))
    }
    TomcatLoader loader = new TomcatLoader(classLoader)

    loader.container = context
    context.loader = loader

    initialize()
}