>我有一个处理多个子域的应用程序,例如
- 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()
}