【Java基础】Session跨域

来源:互联网 发布:js日历插件 编辑:程序博客网 时间:2024/05/06 15:05

之前项目中涉及到跨域问题(2个不同的域名访问同一个服务器)造成session丢失的问题,请求分发用的是nginx

总结了以下,常用的session处理方式有以下几种

ip_hash

【概念】当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上

upstream myproject {    ip_hash;    server 192.168.40.31:8070 //down 将服务器移除负载    server 192.168.40.16:8080; }

【缺点】使用ip_hash指令无法保证后端服务器的负载均衡,可能有些后端服务器接收的请求多,有些后端服务器收到的请求少,而且设置后端服务权重等方法将不起作用

关于ip_hash

session共享

第三方存储

【思路】把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中。那么问题又来了,如何替换掉Servlet容器创建和管理HttpSession的实现呢?(HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的)

方法
1). 设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作(SpringSession)

Spring Session提供了一套创建和管理Servlet HttpSession的方案。Spring Session提供了集群Session(Clustered Sessions)功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题

参考
spring-session
spring-session-官方英文文档
spring-session-csdn-blog

2). 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略(需要耦合Tomcat/Jetty等Servlet容器的代码)

参考(基于tomcat6或者7)
tomcat-redis-manager
tomcat-memcached-manager

session复制

与服务器有关
参考
tomcat中文文档
tomcat官方英文文档

http 无状态 token

百度百科(什么是无状态协议)
OAuth2文档

1 0