CAS利用Iframe框架跨域Ajax登录

CAS利用Iframe框架跨域Ajax登录
CAS利用Iframe框架跨域Ajax登录

CAS利用Iframe框架跨域Ajax登录

因最近经常有时候被一些朋友问到关于CAS跨全域下的Ajax 登录方式实现,正好之前也分析Sina微博的SSO实现,文中也说了SINA 的SSO 实际上(或机制)直接使用了CAS 这个开源项目。于是本文中要说的CAS AJAX登录方式便参考了SINA 的AJAX登录实现。关于具体方案,CAS官方上好象没有提供相关说明,倒是有一文说到Without the Login Screen(详情参见CAS 之自定义登录页实践),其具体实现方式甚是麻烦,又是改源码,又是通过JS跳转,又是一堆配置。当然,虽然如此,但该文中所提到的获取login tikcet 的方式还是值的参考的,因为无论什么方式登录,前提是必须获取到该ticket才允许登录验证。

虽然这里所说的主要是针对CAS,其实具体的实现方式中有些还是值得参考的,如跨域设置cookie, jsonp + iframe 跨域异步请求、P3P 及关于spring webflow 等其它相关的一些信息。

思路

关于具体的实现思路基本上都是参考了SINA,所以详细信息可以在分析Sina微博的SSO实现看到或自己去firebug 一下sina micro-blog。

实践

Environment:

cas-server-3.4.2.1 https://www.360docs.net/doc/7f10133650.html,:8080/cas/

cas-client-3.1.10 https://www.360docs.net/doc/7f10133650.html,:8080/login

以上域名是方便测试跨域,故修改本机hosts。

由于原本的CAS 登录方式是通过跳转、重定向的方式实现,所以需要对CAS的Server端进行调整,使其同时支持Ajax 方式登录。

Step 4:测试,当登录失败后,是否在https://www.360docs.net/doc/7f10133650.html,:8080/login 页中显示https://www.360docs.net/doc/7f10133650.html,:8080/cas/ 中返回过来的error message; 当登录成功后,是否能进入登录成功后跳转的地址(https://www.360docs.net/doc/7f10133650.html,:8080/uc/index):

进入https://www.360docs.net/doc/7f10133650.html,:8080/login页:

可以看到,马上就会去向passport 中请求login ticket,也就是调用上面定义的函数flushLoginTicket() :

OK, 随便输入用户名密码,提交登录,测试时,我先把删除iframe 代码注释:

果如下:

另外,上面说到login ticket 只能使用一次,所以当登录失败后,会马上再次获取login ticket. 接下来,再测试一下登录OK的情况:

可以看到,后面的callback 实际上调用不调用已经没什么关系了,因为在之前已经进行了跳转。

jQuery中的Ajax几种请求方法

jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到). 1. load( url, [data], [callback] ) :载入远程HTML 文件代码并插入至DOM 中。 url (String) : 请求的HTML页的URL地址。 data (Map) : (可选参数) 发送至服务器的key/value 数据。 callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。 这个方法默认使用GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的HTML 文档,DOM 中将仅插入筛选出的HTML 代码。语法形如"url #some > selector"。 这个方法可以很方便的动态加载一些HTML文件,例如表单。 示例代码: $(".ajax.load").load("[url]https://www.360docs.net/doc/7f10133650.html,/QLeelulu/archive/2008/03/30/1130270.html[/url] .post", function (responseText, textStatus, XMLHttpRequest){ this;//在这里this指向的是当前的DOM对象,即$(".ajax.load")[0] //alert(responseText);//请求返回的内容 //alert(textStatus);//请求状态:success,error //alert(XMLHttpRequest);//XMLHttpRequest对象 }); 这里将显示结果。 注:不知道为什么URL写绝对路径在FF下会出错,知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径,所以在FF下你将会出错并不会看到返回结果。还有get()和post()示例都是跨域调用的,发现传上来后没办法获取结果,所以把运行按钮去掉了。 2. jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data (Map) : (可选) 要发送给服务器的数据,以Key/value 的键值对形式表示,会做为QueryString附加到请求URL中。 callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。 这是一个简单的GET 请求功能以取代复杂$.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用$.ajax。示例代码: $.get("./Ajax.aspx", {Action:"get",Name:"lulu"}, function (data, textStatus){ //返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等. this; // 在这里this指向的是Ajax请求的选项配置信息,请参考下图

jQuery Ajax 全解析(.ajax .post .get)

jQuery Ajax 全解析【.ajax .post .get】 1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。 url (String) : 请求的HTML页的URL地址。 data (Map) : (可选参数) 发送至服务器的 key/value 数据。 callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。 这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some > selector"。 这个方法可以很方便的动态加载一些HTML文件,例如表单。 示例代码: $(".ajax.load").load("https://www.360docs.net/doc/7f10133650.html,/QLeelulu/archive/2008/03 /30/1130270.html .post", function (responseText, textStatus, XMLHttpRequest){ this;//在这里this指向的是当前的DOM对象,即 $(".ajax.load")[0] //alert(responseText);//请求返回的内容 //alert(textStatus);//请求状态:success,error //alert(XMLHttpRequest);//XMLHttpRequest对象 }); 注:不知道为什么URL写绝对路径在FF下会出错,知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径,所以在FF下你将会出错并不会看到返回结果。还有get()和post()示例都是跨域调用的,发现传上来后没办法获取结果,所以把运行按钮去掉了。 2. jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求 参数: url (String) : 发送请求的URL地址.

解决js跨域问题

JSONP(JSON With Padding),就是打包在函数调用中的的JSON(或者包裹的JSON)。AJAX和JSONP在jQuery中的调用方式看起来极为相像,千万不要被这种现象迷惑,它们本质上有很大不同。AJAX是通过XMLHttpRequest对象获取非页面内容,而JSONP是动态的添加 3. 20. 21. 22. 23. 其中get.php的代码是

AJAX跨域的解决方法之PHP后端代理

AJAX是一项客户端技术(JavaScript的XMLHttpRequest对象),在网页上可以用于异步加载数据。但是由于同源策略,一般来说位于服务器1的网页无法与其它的服务器(服务器2)沟通。这就产生了AJAX的跨域问题。解决这个问题有较多的办法可以实现,今天与大家分享一个比较常见的办法——后端代理。 起因: 通常指的AJAX对象(XMLHttpRequest对象)是无法访问其它服务器的数据,于是产生了跨域问题。 思考: 既然前端的AJAX无法跨域访问数据,但是可以访问本站(同源:域名、端口、协议)的数据。而PHP作为一门后端编程语言,是可以任意读取互联网的数据,当然就可以读取其它服务器的数据了。再将PHP读取到的数据交给前端使用,这时前端就能在本站的PHP 程序上得到远程服务器的数据了,也就是说,让本站的PHP程序当一个代理人,代替前端去读取数据再交给前端程序使用。这就是AJAX跨域的解决办法之一——后端代理! 需求: 在本地服务器list.html页面上使用AJAX技术获取并显示来自https://www.360docs.net/doc/7f10133650.html,/的数据。

基于同源策略,该请求是无法完成的PHP后端代理实现: 1、编写PHP文件get.php PHP访问https://www.360docs.net/doc/7f10133650.html,的网页数据 2、编写HTML网页list.html

请求本站的后端文件get.php 3、执行结果 使用AJAX也能得到https://www.360docs.net/doc/7f10133650.html,的数据了 后记: 其实解决AJAX跨域请求数据的办法有很多,比如:JSONP、设置响应头、Iframe等等,可以根据自身的实际情况来使用,今天介绍的后端代理核心点在于让后端程序去实现跨域获取数据,再以同源方式提供给前端页面使用,可以在有后端程序支持的情况下使用。下面再给大家列出一些常见的问题。 1、什么是AJAX? AJAX是一项客户端技术,通常指的是window.XMLHttpRequest对象,也有老版本的IE浏览器以其它的对象名称来代表该对象。 2、什么是同源策略?

ajax面试题

Ajax面试资料整理 1、ajax过程 (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象. (2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息. (3)设置响应HTTP请求状态变化的函数. (4)发送HTTP请求. (5)获取异步调用返回的数据. (6)使用JavaScript和DOM实现局部刷新. 2、异步加载和延迟加载 1.异步加载的方案:动态插入script标签 2.通过ajax去获取js代码,然后通过eval执行 3.script标签上添加defer或者async属性 4.创建并插入iframe,让它异步执行js 5.延迟加载:有些 js 代码并不是页面初始化的时候就立刻需要的,而稍后的某些情况才需要的。 3、请解释一下 JavaScript 的同源策略。 概念:同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。 这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议。指一段脚本只能读取来自同一来源的窗口和文档的属性。 为什么要有同源限制? 我们举例说明:比如一个黑客程序,他利用Iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。 4、GET和POST的区别,何时使用POST? GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符 POST:一般用于修改服务器上的资源,对所发送的信息没有限制。 GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值, 也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。 然而,在以下情况中,请使用 POST 请求: 无法使用缓存文件(更新服务器上的文件或数据库) 向服务器发送大量数据(POST 没有数据量限制)

CORS(跨域资源共享) 的配置

兼容情况: 各种新版本的ie10,firefox,opera,safari,chrome以及移动版safari和Android浏览器 ie9及一下版本请使用flash方式来兼容 通过OPTIONS请求握手一次的方式实现跨根域发送请求,需要服务端配置 nginx增加类似如下配置: [html]view plaincopy 1.server { 2. location / { 3. if ($request_method = 'OPTIONS') { 4. add_header 'Access-Control-Allow-Origin' '*'; 5. add_header 'Access-Control-Allow-Credentials' 'true'; 6. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 7. add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep- Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Ty pe'; 8. # add_header 'Access-Control-Max-Age' 1728000; 9. add_header 'Content-Type' 'text/plain charset=UTF-8'; 10. add_header 'Content-Length' 0; 11. return 200; 12. } 13.} 如果没有nginx转发,java需要如下代码: [html]view plaincopy 1.rundata.getResponse().addHeader("Access-Control-Allow-Origin", "*"); 2.rundata.getResponse().addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 3.rundata.getResponse().addHeader("Access-Control-Allow-Headers", "Origin, No- Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Con trol, Expires, Content-Type, X-E4M-With");

前端解决跨域问题的8种方案(最新最全)

1) 在https://www.360docs.net/doc/7f10133650.html,/a.html中: document.domain = 'https://www.360docs.net/doc/7f10133650.html,'; var ifr = document.createElement('iframe'); ifr.src= 'https://www.360docs.net/doc/7f10133650.html,/b.html'; ifr.display= none;

document.body.appendChild(ifr); ifr.onload= function(){ var doc = ifr.contentDocument ||ifr.contentWindow.document; //在这里操作doc,也就是b.html ifr.onload = null; }; 2) 在https://www.360docs.net/doc/7f10133650.html,/b.html中: document.domain = 'https://www.360docs.net/doc/7f10133650.html,'; 这个没什么好说的,因为script标签不受同源策略的限制。 function loadScript(url, func) { var head = document.head || document.getElementByTagName('head')[0]; var script = document.createElement('script'); script.src=url; script.onload= script.onreadystatechange = function(){ if(!this.readyState || this.readyState=='loaded' || this.readyState=='complete'){ func(); script.onload= script.onreadystatechange = null; } }; head.insertBefore(script, 0); } window.baidu= { sug: function(data){ console.log(data); } } loadScript('https://www.360docs.net/doc/7f10133650.html,/su?wd=w',function(){console.l og('loaded')}); //我们请求的内容在哪里? //我们可以在chorme调试面板的source中看到script引入的内容

AJAX使用XMLHttpRequest访问跨域问题解决

AJAX跨域访问的解决方法 Javascscript:使用web代理解决XMLHttpRequest跨域调用问题 XMLHttpRequest对象(IE、Firefox中的XMLHTTP对象)是当今尤其是ajax的web 应用程序的核心.但实际上,使用此对象来编写客户端web应用程序会在跨域的网络连接上受到web浏览器的严重限制. 为什么需要一个代理 web浏览器在网络连接的时候会强制执行一个安全限制,其中就包括调用XMLHttpRequest。此安全限制阻止脚本或者应用程序连接任何其他的不是来自本域的web服务(IE下可通过修改开启选项来允许跨域请求).如果你的web程序和程序使用的XML数据来自同一服务器,那不会有问题。 但是,如果你访问一个web服务器,而web服务器返回页面请求另外一个如Yahoo! Web Service这样的服务器,那么这个访问就会受到限制。

这个问题有很多解决方案,最通用的就是在你的web服务器上安装一个代理.你可以通过调用自己的web服务代理来代替直接调用其它服务器上的web服务,通过代理发起XMLHttpRequest请求,然后代理传递请求到web服务,并且返回客户端应用程序所需要的数据。因为所有数据来自你自己的服务器,所以你的浏览器不会受到什么限制。 出于安全考虑,你web服务器上安装的任何代理被限制使用是一个好主意.转发连接到任意网站url的开放式代理会被滥用。尽管很难限制连接只能来自你自己的应用程序,但是你可以阻止代理去连接那些你没有指定的服务器. Hard code the URL to connect to in the proxy itself 或者提供限制选项.这可以使得代理对不是你的客户端应用程序的用户较低的开放和较少的应用。 其他解决方案 除了通过使用web代理来转发应用程序的服务数据外,还有其他几种方式来绕过浏览器的跨域限制. ?使用阿帕奇的mod_rewrite or mod_proxy来从你的服务器上转发到另外的服务器.在你的客户端代码中你只要做请求就可以了,就好象工 作在你自己的服务器上-------不会有浏览器的限制问题.然后阿帕奇会 神奇的为你请求其他服务器. ?使用json或者动态