先补课,以下网址可以把CAS环境搭起来。

【JA-SIG CAS服务环境搭建】http://linliangyi2007.iteye.com/blog/165307

【JA-SIG CAS业务架构介绍】http://linliangyi2007.iteye.com/blog/165310

【JA-SIG CAS技术框架】http://linliangyi2007.iteye.com/blog/165313

【抓包分析】http://blog.csdn.net/clh604/article/details/20365967

【问题背景】两个系统的整合就不说了,简单来说就是网页放在NginX上,但是ajax调用tomcat的API获取数据,其中tomcat段用CAS做身份认证。具体使用的是org.jasig.cas.client,配置会略有不同就不展开了。

【问题描述】ajax调用不允许跨域访问,如果在该容器中未CAS登陆(没有ticket)则会遇到以下错误。

XMLHttpRequest cannot load [CAS服务器地址] No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin [应用地址] is therefore not allowed access.

【非ajax请求具体的跳转请求】就是标准的跳转,不上图了:

请求1:http访问tomcat。结果:302重定向指向CAS服务器

请求2:访问CAS服务器,带上CASTGC。结果:302重定向指向tomcat并带上ticket

请求3:访问tomcat,带上ticket。结果:200返回资源

【ajax请求具体的跳转请求】:

请求1:ajax访问tomcat。结果:302重定向指向CAS服务器

请求2:访问CAS服务器,带上CASTGC。结果:200返回无内容,浏览器提示错误(chrome)

跨域访问规则Access-Control-Allow-Origin是在CAS服务器配置的,项目无法更改。

【参考的解决方法】

a.在session超时的情况下发ajax请求。返回200正常,并在json中指定状态码302和login.action地址

b.访问login.action。302重定向指向CAS服务器

c.访问CAS服务器登录授权。302重定向回login.action

d.访问login.action带有ticket。302重定向next_page(即一开始ajax请求的页)

e.访问next_page刷新整个页

【具体解决过程】

1.修改CAS授权过滤器,session无效的ajax请求先返回200正常,并在json中指定业务错误码session_lost

继承修改AuthenticationFilter的doFilter方法:

a.如果session中有assertion,通过,进入下一层(tomcat端向CAS服务器验证ticket)

b.(无assertion)如果有ticket,通过,进入下一层filter(tomcat端向CAS服务器验证ticket)

c.(无assertion无ticket)普通http请求,重定向到CAS服务器

d.(无assertion无ticket)ajax请求,返回200并在json中指定session_lost

e.改配置web.xml,指向新的AuthenticationFilter类,并且serverName要与NginX的域名匹配

2.在js的callback中处理session_lost,将网址定位到/login.action

window.location.href=/app/login.action

3.在java的/autoLogin中重新登录并根据参数next_page重定向,完成登录和刷新

(因为是普通http请求,会先跳转到CAS登录,回来建立session信息,然后再跳转到用户本来的页面)

【其中一些细节问题】

a.通过检查请求头的"X-Requested-With"为"XMLHttpRequest"鉴别是ajax调用

b./login.action中要判断nextpage避免指向自己,若"/login.action?nextpage=/login.action"会导致死循环,爆栈很欢乐~

c.登录后cookies对JSESSIONID写入不对也会导致session找不到而死循环,一番排查后发现Tomcat写入的cookies匹配的path是应用路径,而网页上匹配的是根路径,所以需要手动写cookies把JSESSIONID匹配path为"/"。

d.web.xml中serverName要与网页域名匹配(因为这里经过了DNS和反向代理),否则会报登录的service与当前访问的service(即域名)不匹配的错误。

e.几种跳转方式的区分

request.getRequestDispatcher(str).forward(request, response);
---服务器内部跳转,路径从应用开始算,即"/"等效于 "http://域名/应用/" response.sendRedirect(str);
---浏览器端302重定向,参数为完整地址。 @Controller实例的方法中的return str;
---服务器内部加载页面,路径从应用开始算。 @Controller实例的方法中的return "redirect:/";
---浏览器端302重定向,但是路径从应用开始算。 浏览器端js中window.location.href
---浏览器本窗口打开页面,路径从域名后开始计算,即"/"等效于 "http://域名/"

f.warnning:第一个是CSRF风险即cookies被盗用,电脑入域或网络隔离可规避;第二个是serverName配置是写死在web.xml上,改域名就要重新部署应用,可改为配置。

完事,可以ajax随便愉快玩耍了~

基于CAS的SSO单点登录-实现ajax跨域访问的自动登录(也相当于超时重连)的更多相关文章

  1. 浅析JSONP-解决Ajax跨域访问问题

    浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现 ...

  2. Hbuilder编辑App时,ajax跨域访问失败问题

    今天试着用Hbuilder写app的前段显示页面,在第一步时就被打住了,ajax异步调用服务器的登录接口时,报错, 显示这样的错误 XMLHttpRequest cannot loadhttp://w ...

  3. ajax跨域访问的解决方案

    今天的工作中要访问摄像机内部的一个web站点,这就涉及到jquery的ajax跨域访问的问题.我使用的是jquery1.7的版本,下面总结如下: 问题一:一开始用IE调试,总是返回No Transpo ...

  4. Ajax跨域访问解决办法

    方法1. jsonp实现ajax跨域访问示例 jsp代码: <body> <input type="button" onclick="testJsonp ...

  5. Web Api 2(Cors)Ajax跨域访问

    支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示   随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...

  6. ajax 跨域访问的解决方案

    ajax 跨域访问的解决方案 一.什么是跨域: 1.什么样的请求属于跨域: 域名,端口有任何一个不相同都属于跨域: 二.跨域的常用几种解决方案: 1.jsonp: 2.iframe: 3.webcon ...

  7. 关于JQuery Ajax 跨域 访问.net WebService

    关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...

  8. JS Ajax跨域访问

    js ajax跨域访问报"No 'Access-Control-Allow-Origin' header is present on the requested resource 如果请求的 ...

  9. ajax跨域访问http服务--jsonp

    在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...

随机推荐

  1. hdu1509 优先队列

    Windows Message Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  2. MyBatis 源码解析SqlSession.getConnection(Connection异常:关闭或者不在Mybatis事务)

    从SqlSession的实现类SqlSessionTemplate源码中,看出相关方法被其内部类SqlSessionInterceptor(实现了InvocationHandler)代理 当调用Sql ...

  3. PIE SDK克里金插值法

    1.算法功能简介 克里金插值法基于一般最小二乘法的随机插值技术没用方差图作为权重函数,被应用于任何点数据估计其在地表上分布的现象,被称为空间自协方差最佳插值法,是一种最优内插法也是一种最常用的空间插值 ...

  4. 「BZOJ1485」[HNOI2009] 有趣的数列 (卡特兰数列)

    「BZOJ1485」[HNOI2009] 有趣的数列   Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai ...

  5. 【OpenCV-python】CV2和PIL按box信息实现图像裁剪

    # 用cv2实现裁剪 import cv2 import os img = cv2.imread("./test_and_verification/1406170100001.jpg&quo ...

  6. 最近准备把安卓和java的知识再回顾一遍,顺便会写博客上!千变万化还都是源于基础,打扎实基础

    最近准备把安卓和java的知识再回顾一遍,顺便会写博客上!千变万化还都是源于基础,打扎实基础,加油吧 距离去北京还有23天

  7. Hadoop Yarn REST API未授权漏洞利用挖矿分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 一.背景情况 5月5日腾讯云安全曾针对攻击者利用Hadoop Yarn资源管理系统REST API未授权漏洞对服务器进行攻击,攻击者可以在未 ...

  8. 【linux相识相知】sed命令

    在之前的博客中我们介绍了文本三剑客中grep,本次博客就另外一名剑客——sed做出详细的描述,sed真的是一款强大的工具.下面让我们来一起看一下吧! 概述和工作机制 SED的英文全称为Stream E ...

  9. 从零开始写C# MVC框架之--- 项目结构

    框架总分2个项目:Web开发项目.帮助类项目 (ZyCommon.Zy.Utilities) 1.ZyCommon,是Web开发项目结构.新建一个空解决方案,再建Data.Service.ZyWeb解 ...

  10. Apache-Maven 的安装及配置

    一. 下载 没有 Maven 的朋友可以去 Apache 的官网下载一个 Maven, Apache-Maven 官网下载 : https://maven.apache.org/download.cg ...