CAS单点登录 AJAX 跨域提交

 

       一直以来网上很多高手使用CAS平台时被埋在了不允许外部提交这个死胡同里,大家也见招拆招,iframe方式,以及修改webflow等方式来解决,但是效果一般般,看资料的人更是一头雾水,照着弄80%的人失败。

         经过公司项目上需要,研究了一下,实际上cas还可以这样玩来实现外部表单提交也就是ajax提交方式。

       长话短说,我使用的是tomcat8+JDK1.7+cas4.0,理论上本方法兼容新老版本(需要对应调整截取)。首先在cas默认首页,右键源码可以看到以下信息



 

lt和execution 这两个重要信息,其中execution 是随机码,提交数据后,系统会在后台去校验这个,

通过以下抓包,我们可以证明


       有了这些信息,我们就不用老想着去改cas来达到目的,我们有更好的办法,不动cas一点源码就能搞定ajax异步登录问题,

1.通过ajax获取CAS Login页面

2.得到Login页面后,解析出lt,execution等重要元素

3.再将这些信息post到login里面大功告成

 

贴上源码吧:

 

  
<a href="#" onclick="login()">点这测试</a>
<script type="text/javascript" src="/cas/js/jquery.min.js"></script>

<script>
 function login(){
	 $.ajax({
		 url: 'http://localhost/cas/login',
		 type: 'GET',
		 data:{Name:"keyun"},
		 dataType: 'html',
		 timeout: 1000,
		 async:false,
		 error: function(){alert('Error');},
		 success: function(result){
			 //如果用户本来就是登录着的,可以选择让用户直接跳转,还有个更妥当方法是注销用户,然后再掉login重新获取
			 if(result.indexOf("Log In Successful")!=-1){
				// window.location.href="http://localhost/test";
				logout();
				 return;
			 }
			 
			 

			 var ltsl=result.indexOf("\"LT"); //截取LT位置
			 var lt=result.substring(ltsl+1);
			 lt=lt.substring(0,lt.indexOf("\""));
			 
			 var evsl=result.indexOf("execution\" value=\""); //截取execution位置

			 var ev=result.substring(evsl+18);
			 ev=ev.substring(0,ev.indexOf("\""));
			 post(lt,ev);
		}
	  });
 }
 
 function logout(){
	 $.ajax({
		 url: 'http://localhost/cas/logout',
		 type: 'GET',
		 dataType: 'html',
		 timeout: 1000,
		 async:false,
		 error: function(){},
		 success: function(result){
			 login();
		}
	  });
 }
 
 //提交请求
 function post(lt,ev){
	 $.ajax({
		 url: 'http://localhost/cas/login',
		 type: 'POST',
		 async:false,
		 data:{"execution":ev,"lt":lt,"password":"1","submit":"LOGIN","username":"1","_eventId":"submit"},
		 //dataType: 'json',
		 timeout: 1000,
		 error: function(r){
			 debugger;
			 alert('Error');},
		 success: function(result){
			 //如果登陆成功,则跳转,否则提示错误
			 if(result.indexOf("Log In Successful")!=-1){
				 //alert('ok   lt:'+lt);
				 window.location.href="http://localhost/test";
			 } 
		}
	  });
 }
</script>

 

 

         以上方式需要注意的是:截取信息时可能由于版本不一样,截取的位置不一样,如果报错建议输出看看是否对了。

 

         本页面记得要放在CAS根目录下,比如访问地址:

         http://localhost/cas/testpost.jsp

         然后就是你其他域的用户名密码只需要post到这个页面,让这个页面自动去提交就OK了!

         

 

 

 

 

 

猜你喜欢

转载自inlhx.iteye.com/blog/2175859