是否可能跨域共享Session信息或者怎么实现单点登录?

ynduanlian 2014-12-19 08:36:52
一个网站下挂接了多个模块,这些模块可能使用独立的二级域名,在不同的服务器上。怎么样能让用户只需登录一次,就能在访问这些模块时都是已登录的状态?
...全文
1212 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hailshao 2015-02-05
  • 打赏
  • 举报
回复
把A网站的sessionId通过url传递到另外一个网站B,B网站取到sessionid再通过webservice去A网站校验,取得用户名等需要的信息,在B网站调用登陆接口。更安全一点是B网站只处理http头的refer为A网站的请求
呆饿猪 2015-02-04
  • 打赏
  • 举报
回复
引用 10 楼 shrimpma 的回复:
用Redis+cookie的方法实现 比如 a.xx.com, b.xx.com 1.用户登陆信息写人session,session保存在redis中, cookie 写入.xx.com 2.由于 cookie是http协议的一部分 这样每个站点下就有会话信息了
可以
shrimpma 2015-01-21
  • 打赏
  • 举报
回复
用Redis+cookie的方法实现 比如 a.xx.com, b.xx.com 1.用户登陆信息写人session,session保存在redis中, cookie 写入.xx.com 2.由于 cookie是http协议的一部分 这样每个站点下就有会话信息了
最勇敢的鸟 2015-01-07
  • 打赏
  • 举报
回复
用最简单的memcached+cookie就可以解决,不用搞复杂了
吟风笛 2014-12-29
  • 打赏
  • 举报
回复
我的建议是用redis做session共享或者用memcatch 做session共享
OhSunshineJava 2014-12-29
  • 打赏
  • 举报
回复
memcache sso
感同深受 2014-12-28
  • 打赏
  • 举报
回复
不妨将认证成功的ID写入cookie中,当跳转到二级域名下时 读取顶级域名下的cookie信息,将认证ID送入登陆服务器进行认证,成功后将用户信息保存到session。
jiangbai333 2014-12-23
  • 打赏
  • 举报
回复
出于安全性原因,session不能共享!
「已注销」 2014-12-22
  • 打赏
  • 举报
回复
你了解下CAS
jianhuiweifeng 2014-12-19
  • 打赏
  • 举报
回复
用redis集群做session共享,然后在tomcat的context配置文件中加上 <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve"/> <Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="192.168.1.190" port="6379" database="0" maxInactiveInterval="3600" /> 就可以做session共享。
ynduanlian 2014-12-19
  • 打赏
  • 举报
回复
是的,也可以简化到下面的问题: 两个服务器上的网站共享同一个数据库,所以我想实现这样的功能: 如果用户在A站已经登录,那么当它通过点击A站上的B站链接进入B站时,不再需要验证。由于AB两站是两个不同的IIS进程,无法共享同一Session,所以我只能在链接中把用户的用户名密码传递到B站,比如在A站页面中这样写B站链接: http://serverB?UID=X&PWD=Y 但这样的话,即便我把密码Y加密码,某个人看到这个链接后,虽然他不知道真实的用户密码,在浏览器地址栏输入后也可以登录B子网站,这个有没有什么办法来解决这个问题?
oicq323 2014-12-19
  • 打赏
  • 举报
回复
说白了就是跨服务器、跨程序的数据传递吧~~从这个角度去想想。。。我是来帮顶的
class Session { //mysql的主机地址 const db_host = "localhost"; //需要第三方指定ip地址 //数据库用户名 const db_user = "root"; //需要第三方指定自己的用户名 //数据库密码 const db_pwd = ""; //需要第三方指定自己的库据库密码 //数据库 const db_name = "thinkphp"; //需要第三方指定数据库 //数据库表 const db_table = "tbl_session"; //需要第三方指定数据表 //mysql-handle private $db_handle; //session-lifetime private $lifeTime; function open($savePath, $sessName) { // get session-lifetime $this--->lifeTime = get_cfg_var("session.gc_maxlifetime"); // open database-connection $db_handle = @mysql_connect(self::db_host, self::db_user, self::db_pwd); $dbSel = @mysql_select_db(self::db_name, $db_handle); // return success if(!$db_handle || !$dbSel) return false; $this->db_handle = $db_handle; return true; } function close() { $this->gc(ini_get('session.gc_maxlifetime')); // close database-connection return @mysql_close($this->db_handle); } function read($sessID) { // fetch session-data $res = @mysql_query("SELECT session_data AS d FROM ".self::db_table." WHERE session_id = '$sessID' AND session_expires > ".time(), $this->db_handle); // return data or an empty string at failure if($row = @mysql_fetch_assoc($res)) return $row['d']; return ""; } function write($sessID, $sessData) { // new session-expire-time $newExp = time() + $this->lifeTime; // is a session with this id in the database? $res = @mysql_query("SELECT * FROM ".self::db_table." WHERE session_id = '$sessID'", $this->db_handle); // if yes, if(@mysql_num_rows($res)) { // ...update session-data @mysql_query("UPDATE ".self::db_table." SET session_expires = '$newExp', session_data = '$sessData' WHERE session_id = '$sessID'", $this->db_handle); // if something happened, return true if(@mysql_affected_rows($this->db_handle)) return true; } else // if no session-data was found, { // create a new row @mysql_query("INSERT INTO ".self::db_table." ( session_id, session_expires, session_data) VALUES( '$sessID', '$newExp', '$sessData')", $this->db_handle); // if row was created, return true if(@mysql_affected_rows($this->db_handle)) return true; } // an unknown error occured return false; }

25,984

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧