最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程

涉及的关键知识点:

1、jQuery ajax跨域重定向,要理ajax解跨域重定向,先要了解浏览器对重定向的处理。正常我们请求一个地址,如果server返回302,那么浏览器会再发起一次重定向后的http请求;用jquery ajax发起一次异步请求,server返回302,如果重定后url的域名跟ajax请求的域名是同一个域名的话,浏览器会再发起一次重定向后的http请求,请求成功会调用ajax的success函数,如果重定向后url的域名跟ajax请求的域名不是同一个域名,也就是跨域重定向(跨域redirect),这个时候浏览器看到返回的response的Location跨域了就不会再发起请求,请求被拦截了,ajax请求失败会调用error方法

那么如果我们非要做跨域重定向呢?这也是可以实现的,普通的ajax请求不行,我们需要通过jsonp的方式,而且需要设置crossDomain:true,可以参考https://api.jquery.com/jQuery.ajax/  关于jquery.ajax方法的crossDomain 参数的说明

跨域redirect实例:

test.html

[html] view plaincopy
  1. <script src="jquery.js"></script>
  2. <script type="text/javascript">
  3. var res=$.ajax({
  4. type:"get",
  5. dataType:"jsonp",/*-----------------------*/
  6. url: "http://api.luojisiwei-inc.com/test/test.php?callback=?",
  7. crossDomain:true,/*-----------------------*/
  8. success: function(data){
  9. alert("success:"+data.name);
  10. },
  11. beforeSend:function(){
  12. },
  13. complete:function(data,status){
  14. }
  15. });
  16. </script>

跟test.html同域名下的test.php

[php] view plaincopy
  1. <?php
  2. header("Location:http://video.luojisiwei-inc.com/");//跨域重定向

http://video.luojisiwei-inc.com/index.php

[html] view plaincopy
  1. echo "aaaaaaaaaa";
  2. setcookie("vtest","ooooooooooo");//跨域设置cookie
  3. die;

访问test.html,在firebug下看到请求的结果

客户端先给test.PHP发ajax请求,然后被重定向到http://video.luojisiwei-inc.com下,并且返回一个Set-Cookie的Response,这样就实现了跨域重定向和跨域设置Cookie

然后浏览器中访问http://video.luojisiwei-inc.com,发现该域名下确实有了个叫vtest的Cookie

京东商城跨域设置Cookie实现SSO单点登陆过程

可以先看下这边文章:http://blog.chinaunix.net/uid-25508399-id-3431705.html

1、点击首页的登陆按钮跳转到京东的登陆中心https://passport.jd.com/new/login.aspx?ReturnUrl=http%3A%2F%2Fwww.jd.com%2F,然后输入用户名、密码验证,验证通过跳转到ReturnUrl指定的地址,也就是京东首页

2、首页通过Jquery.getJSON()方法发起http://passport.jd.com/new/helloService.ashx请求,跨域获取需要跨域设置登陆cookie的应用列表,返回一个Json数据

3、js遍历sso,通过jQuery.ajax()方法对其中的每条数据发起跨域的jsonp请求,我猜测京东的js代码大概是这么写的

[javascript] view plaincopy
  1. <script type="text/javascript">
  2. $.ajax({
  3. type:"get",
  4. dataType:"jsonp",/*-----------------------*/
  5. url: "http://sso.jd.com/setCookie?t=sso.minitiao.com&callback=?",/*-----------------------*/
  6. crossDomain:true,/*-----------------------*/
  7. success: function(data){
  8. },
  9. beforeSend:function(){
  10. },
  11. complete:function(data,status){
  12. }
  13. });
  14. </script>

请求的结果是这样的:

可以看到返回一个重定向的Response,而且是跨域的重定向,由于发起的是跨域的jsonp请求,所以浏览器会根据返回的重定向url发起一次请求,也就是最后的跨域设置Cookie的请求

4、浏览器发起sign请求跨域设置Cookie,请求和返回结果如下

返回的Response header中含有Set-Cookie项,这样就在sso.minitiao.com域名下设置了Cookie,可以打开sso.minitiao.com发现确实有了ceshi3.com这样一个Cookie

5、至此京东就完成了单点登录的全过程

SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析相关推荐

  1. SSO单点登录学习总结(2)——基于Cookie+fliter单点登录实例

    1.使用Cookie解决单点登录 技术点: 1.设置Cookie的路径为setPath("/").即Tomcat的目录下都有效 2.设置Cookie的域setDomain(&quo ...

  2. python绕过验证码登录_python接口自动化(十三)--cookie绕过验证码登录(详解)...

    简介 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接).获取不到也没关系,可以通过添加cookie的方式绕过验证码.(注意:并不是所有的 ...

  3. 不在一个局域网下,如何设置可以被远程登录的服务器[ubuntu]?【ssh登录】【不使用软件】

    不知道在看见这篇博文之前,你是否已经兜兜转转了好久,并且已经实现了局域网下的远程登录,但是两个电脑不在一个网络下,怎么都连不上. 那是因为,你没有进行内网穿透.简单说明一下内网穿透,就是,把的电脑的I ...

  4. 【No.1】基于Cookie的单点登录(SSO)

    2019独角兽企业重金招聘Python工程师标准>>> 这篇主要说明基于Cookie的单点登录实现,以及Cookie的一些特性以及使用说明. 1.Cookie是什么,如何工作的 在程 ...

  5. php跨域单点登录,SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析...

    SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1. 跨域redirect实例: te ...

  6. Cookie同域,跨域单点登录

    Cookie 同域单点登录最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录.单点登录: ...

  7. 跨域 Cookie 实现单点登录

    单点登录 单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com.c.com)都认为已经登 ...

  8. 【笔记】跨域重定向中使用Ajax(XHR请求)导致跨域失败

    背景: 1.前端Web中有两个域名,a.com和b.com,其中a.com是访问主站(页面),b.com是数据提交接口的服务器(XHR请求) 2.a.com中用XHR调用b.com/cerate[没有 ...

  9. java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...

    如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式 需求,项目A在服务器A上,需要重定向到服务器B上项目B,并且需要携带参数,参数对用户不可见,所以不可以将参数拼接在重定向ur ...

最新文章

  1. JS(内置对象,全局函数,事件,事件对象)
  2. Echange配置企业邮件收发策略
  3. UpdateProgress
  4. hdu 1163 ( 求n^n位根)
  5. 电液伺服系统_电液伺服系统的误差/偏差以及开环增益
  6. html文本可选择,如何用javascript选择html文本?
  7. vue el-checkbox循环多个如何选中当前的_一次关于Vue的自我模拟面试
  8. 记录一次Socket异常:java.net.SocketException: Connection reset
  9. react-navigation设置navigationOptions中Static中使用 this 的方法
  10. FPGA(5)--VHDL--10十进制计数器及7段显示译码器
  11. python代码_python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!
  12. 简单FTP服务器(ccd) v1.0
  13. python编程(gevent入门)
  14. vba 字体颜色_VBA第一章自检,23关,你能破吗?
  15. oracle 常用语句2
  16. mfc多文档获取版本号_管理Microsoft Office文档—基于SOLIDWORKS PDM
  17. iOS 全局变量(转)
  18. linker command failed with exit code 1 (错误总结)
  19. c++开源库rapidxml介绍与示例
  20. php 0x80004005,错误类型:Provider (0x80004005)未指定的错误 的一个处理方法

热门文章

  1. Qt Creator使用调试助手
  2. Qt Creator指定构建设置
  3. Linux 内核的同步方式
  4. QT的QStandardItemEditorCreator类的使用
  5. c++容器共性机制研究
  6. 经典C语言程序100例之二五
  7. java并发包消息队列
  8. maven+springMVC+mybatis+junit详细搭建过程
  9. Mule3用户手册:Mule ESB 3使用要点
  10. 检索数据_17_按照指定的次序返回查询结果