如何在圣杯中的子域之间获取相同的会话



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

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

用户在使用应用时可以跨这些子域切换。发生这种情况时,会话不会在这些子域之间共享。我使用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("/")
}

关于如何在开发和生产中使其正常工作的任何建议?提前感谢任何帮助。

要访问默认的 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()
}

最新更新