处理session跨服务器、跨域失效问题

最近遇到一个需求,就是在单体架构的系统上要将系统中的文件资源分离到另一个资源系统中,这时候就需要考虑到跨域的问题了。网上解决方式有以下几种:

网上跨域的解决方案

Java中解决跨域的方式主要有两种:

1)第一种解决方法 后台代码在被请求的Servlet中添加Header设置response.setHeader("Access-Control-Allow-Origin", "*");

2)通过jsonp跨域请求的方式(具体什么是jsonp跨域百度上可以搜索到很多资料,这里就不过多解释)

但是java处理的跨域问题只是解决了前端可以正常调用跨域访问不同后台的接口的问题,但是session还是会因为跨域的问题而失效。所以我又找了一下网上解决保证跨域session不失效的解决方案:

1、基于NFS的Session共享

2、基于数据库的Session共享

3、基于Cookie的Session共享

4、基于MemcacheredisSession共享

我需要的只是在跨域的时候session不失效就ok了,但是这几种解决方式感觉代价太大,不太适合我们目前的小系统开发要求。于是我就想到先去了解cookiesession的执行流程

Cookie、session的交互原理

Cookie是保存在客户端,session是保存在服务器端的,具体的详细介绍百度有很多,这里就不用介绍了。首先我们需要处理cookie跨域的问题,保证都是共享一个cookieCookie跨域需要处理两个属性:

1、cookie.setDomain("www.baidu.com"); // 设置域名   

2、cookie.setPath("/search"); // 设置路径

一般我们需要把path设置为“/”代表根路径。Domain设置为同一一个一级域名,如:aaa.hshkj.com/bbb.hshkj.com,我们就可以设置 COOKIE 的域为 .hshkj.com,这样两个子域名就可以访问此COOKIE。这样各个服务器共享同一客户端 SESSION ID 的目的就达到了。一下是cookiesession交互的流程图:

 

理解的cookiesession的交互流程,我们就明白了session失效的原因,比如客户端访问A服务器的时候,生成的jsessionid的之为11111,但是当浏览器去调用B服务器的资源时,会携带这个jsessionid过去,发现B服务器上没有与之对应的session,这时B服务器又会生成一个新的session,并通过set-cookie方法把与该新的session对应的jsessionid(如222)设置到cookie中,这时候浏览器的jsessionid就变为了222,当浏览器再访问A服务器时,发现与222对应的没有session,这时候A服务器又会重新生成新的session

解决cookie、session跨域问题,如何解决session因跨域而失效的问题

知道了问题的所在,那我们可以提出解决的方案了(方法一是我提出的解决方案,方法二是网上提供的方案):

1、保证jsessionid在两个server的上都一致,这样就不会重新生成session

2、因为我用的是tomcat,所以我们可以让自己的tomcat使用各自的jsessionid

第一种的解决方案的样例代码

在资源服务器中添加一个filter类,在doFilter方法中执行

String jsessionId = CookieUtils.getCookieValue(httpRequest, "JSESSIONID");

//将session获取出来

HttpSession session = httpRequest.getSession();

//System.out.println("-----jsessionId------->>"+jsessionId);

CookieUtils.setCookie(httpRequest, response, "JSESSIONID", jsessionId);

第二种方法,tomcat\conf\context.xml,修改session的别名

<Context sessionCookieName="SHGJSESSIONID" sessionCooliePath="/">

这样在该tomcat下获取jsessionid别名就是SHGJSESSIONID对应的值

 

注意:方法一的时候要先获取session,然后再通过cookie修改JSESSIONID的值,这样才能保证JSESSIONID的值没有变。因为如果获取session 的放在我们定义的cookie后面的话,系统在自动生成session时,调用setcookie方法就会在我们的setcookie的后面,这样就达不到我们想要设计的效果了。

总结:其实很多时候,我们要解决问题时,我们都是需要先了解原理,然后再大胆的猜测解决方案,大胆的去尝试,你就会收到意想不到的效果

 

猜你喜欢

转载自www.cnblogs.com/wumingxiaozi/p/10018150.html