在Intellij idea下为tomcat7设置sessionCookieName

由于现在的浏览器在对同一ip不同端口的cookie保存时,并没有区分不同端口的session信息。那么当我们时同开启两个tomcat进行开发时,由于用户验证信息是通过session进行保存的。那么就会出现,在同一个机器布置两个系统A和B,当用户A登陆A系统并成功之后,用户B登陆B系统之后,再回到A系统,当进行点击时,就会提示A用户已经不存在了,即相应的session信息已经不存在了。

java的web系统,一般是通过jessionid来进行session标识的,即A系统和B系统均会与客户端进行jsessionid的信息交互。但由于这两个系统是在同一个ip上,所以客户端的浏览器并不能区分每一个jessionid与不同的系统之间的关系。相反,他会将后来的jessionid覆盖前一个cookie信息,即后面的登陆时,jessionid会将A系统的jsessionid信息覆盖掉,再请求A系统时,客户端就会发送系统B的jsessionid至A系统,这样A系统肯定会取不掉最开始的session信息,而被认为是新登陆了。

解决的办法就是两个系统使用不同的session标识来保存信息,从tomcat7开始,为兼容j2ee规范,tomcat提供了一套标准的设置sessioncookiename的方法。即在整个tomcat下的conf目录下的context.xml中添加一个属性即可。官方原话如下:

  1. org.apache.catalina.SESSION_COOKIE_NAME system property: This has been removed. An equivalent effect can be obtained by configuring the sessionCookieName attribute for the global context.xml (in CATALINA_BASE/conf/context.xml).

即在tomct7之前也可以设置Sessioncookiename,不过在tomcat7之中,可以通过设置tomcat conf目录下的context.xml添加一个属性即可。如下所示:

  1. <!– 这里重写session cookie name,以防止同一IP下多个端口访问时,session失效 –>
  2. <Context sessionCookieName=“tomcat7utf8_session”>

这样即可(本以为是添加参数parameter或子结点,结果都不是,只需要在顶层的context节点上增加一个属性即可)

这样在tomcat启动后,相应的sessionId标识就是变成这里设置的了。

 

对于Intellij idea来说,因为这里设置的是整个tomcat的,所以intellij idea在复制tomcat配置的时候,会将这个配置一并的copy至相应的intellij tomcat配置下面。所以在intellij idea下开发项目时,不用担心这个配置会被删去。

这样,通过intellij idea启动两个项目(分别是两个tomcat时),因为不同的tomcat的session标识不一样,再也不会出现session丢失的问题了。

 

ps:之前在oschina上有提出在单个的context下添加配置也可以,这里未做测试,只因为如果在tomcat/conf/server.xml中配置其他项目时,在intellij中进行配置文件copy时,自定义的配置会被删去导致失效的问题。

 

除了在Intellij idea中出现这个问题, 我还在Eclipse中出现了同样的问题, 解决办法正在试验中

 

如有帮助, 可以支持一下
分享到:

发表评论

昵称

沙发空缺中,还不快抢~