ZUUL单点路由与微服务的SESSION共享

几个基本概念

1、session建立在客户端与服务器端,客户端与zull、APP1、APP2 ...间的session都不同。

2、session创建在request.getSession()函数调用时,或者是推送第一个页面时(默认,也可以在jsp中输入<% @page session="false"%> 来关闭session的创建)。

3、cookie在客户端保留,用于记录与服务器的交互信息。服务器端通过response.addCookie(ck)向客户端植入cookie。较为常见的是给客户端植入sessionid,这样一定程度可以保证信息的安全。

4、cookie是不可跨域名的。而path属性决定允许访问Cookie的路径(ContextPath),在spring cloud中,一般将微应用的context-path设置到zuul路径的下一级别,例如zuul: /appzuul, app1的:/appzuul/app1,app2的:/appzuul/app2。这样在zuul上就可以读取app1和app2的cookie了。

5、spring-boot有一个坑,到了2.0以后,context-path在sevlet的级别之下了。server.servlet.context-path= /appzuul/app1

6、可以通过springsesion+redis的方式,根据客户端的cookie中的sessionid获取保存在redis中的该session的其它信息,如用户名等。从而实现与其它应用共享session信息。

7、举个例子:一个spring cloud应用,在app1单点登陆后创建session,其它应用不再需要登陆。具体来说,app1登陆后创建session,同时通过response.addCookie(ck) 将cookie织入到客户端,植入的内容为sessionId。此时客户端与app2还没有session,但可以在zuul的过滤中判断客户端是否有cookie。由于app1已经建立了session, 所以通过zuul时肯定有一个zuul可以识别出的cookie。拿到这个cookie的sessionid信息,去redis中查出其它信息。在路由给app2时将这些信息放到request的header中。app2在收到请求后,通过request.getHeader获取这些信息,然后创建信息的session,并把这些信息植入到新创建的session中,从而实现了session信息的共享。

你可能感兴趣的:(ZUUL单点路由与微服务的SESSION共享)