我有一个处理多个子域的应用程序,例如
用户可以在使用该应用时切换这些子域。发生这种情况时,不会在这些子域之间共享会话。我使用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("/")
}
有关如何在开发和生产中实现此功能的任何建议? 提前感谢您的帮助。
答案 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()
}