最重要的两点:

  1. ajax请求跨域的时候,默认不会携带cookie。
  2. 请求分为普通请求(HttpRequest)和Ajax请求(XMLHttpRequest)

先屡一下跨域CAS认证的流程:

前端发起ajax请求,请求首先被跨域Filter过滤,加上Access-Control-Allow-Origin , 然后再被CASFilter过滤,此时没有登录的用户会被重定向到cas.host.cn/login进行登录,最最最关键的地方就在这里。

通常是这样的:前端发起HttpRequest,后端接受请求并执行res.sendRedirect(),前端接受相应并发起HttpRequest,请求重定向后的页面,其中HttpRequest不存在跨域问题。
但是现在是这样的:前端发起XMLHttpRequest, 后端接受请求并执行res.sendRedirect(),前端接受相应并发起XMLHttpRequest,请求重定向后的页面,但是,由于cas.host.cn/login没有配置跨域(安全上也不允许),所以产生了跨域!

解决思路:

思路就是把XMLHttpRequest替换为HttpRequest

方案:

@Path("admin/auth")
public class AuthController { private static Properties prop = new Properties();
static {
InputStream in = CORSFilter.class.getClassLoader().getResourceAsStream("dev.properties");
try {
prop.load(in);
} catch (IOException e) {
e.printStackTrace();
}
} @Get("validate")
public String validate(Invocation inv) throws JSONException {
HttpServletRequest request = inv.getRequest();
Assertion assertion = (Assertion) request.getSession().getAttribute("_const_cas_assertion_");
JSONObject result = new JSONObject();
if (assertion == null || assertion.getPrincipal().getName() == null) {
result.put("success",false);
result.put("data", prop.getProperty("cas.server.url") + "/login?service=" + prop.getProperty("server.url") + "/thoth-admin/admin/auth/redirect");
} else {
result.put("success", true);
}
return "@json:" + result.toString();
} @Get("redirect")
public void redirect(Invocation inv) throws IOException {
inv.getResponse().sendRedirect(prop.getProperty("server.url")+"/thoth-admin/admin");
}
}

用户每次发起ajax请求之前,先请求validate接口,检验当前用户的cookie是否失效,如果没有,就返回{success: true},前端则继续发送接下来的ajax请求。

如果失效了,就返回一个字符串,内容是将要跳转的cas验证地址,前端则手动通过location.href = "这个地址"来进行HttpRequest。cas登录成功后,会再次重定向,重定向的地址是service=后面的地址。

另外,需要注意的一点是跨域Filter优先级必须要高于CASFIlter,否则请求会先被CASFilter过滤,没有登录过得用户会被302跳转到cas.mioffice.cn/login, 但是事实是你连跳转的机会都没有就会被浏览器告知你跨域了。
因为你的请求还没有被跨域Filter过滤,此时响应头里还没有Access-Control-Allow-Origin。

前后端分离下的跨域CAS请求的更多相关文章

  1. 前后端分离crud(跨域问题)讲解

    1 前后端分离 1.1 后端 ssm+maven 多模块 swagger 文档描述(代码拷贝过来,就可以生成了,https://www.cnblogs.com/wings-xh/p/11991511. ...

  2. 【坑】前后端分离开发中 跨域问题以及前台不带cookie的问题

    文章目录 前言 跨域问题 cookie问题 拦截器导致的跨域问题 后记 前言 场景一: 前台哒哒哒的点击页面,发送请求,但是后台服务器总是没有回应,后台接口虽打了断点,但是根本进不到断点处: 前端:我 ...

  3. 前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等

    前言 在前后端没有分离的时候,前端开发要么是写静态页面,数据渲染后端来做,要么就是前端的页面和后端的代码刚开始的时候就合并在一起,每次后端代码更新了之后,前端也要更新一下代码,然后重启一下服务,还是比 ...

  4. Vue+SpringBoot前后端分离中的跨域问题

    在前后端分离开发中,需要前端调用后端api并进行内容显示,如果前后端开发都在一台主机上,则会由于浏览器的同源策略限制,出现跨域问题(协议.域名.端口号不同等),导致不能正常调用api接口,给开发带来不 ...

  5. 前后端分离 vue+springboot 跨域 session+cookie失效问题

    环境: 前端 vue   ip地址:192.168.1.205 后端 springboot2.0  ip地址:192.168.1.217 主要开发后端. 问题: 首先登陆成功时将用户存在session ...

  6. 前后端分离开发,跨域时jsessionid每次请求都变化的问题解决方法

    本解决方法的使用前提是,前端开发使用的是vue,后端使用java(SpringMVC) 在前后端分离开发过程中,可能会出现因跨域而导致每次请求的jsessionid不一致的情况 解决方法: 前端:要在 ...

  7. 前后端分离djangorestframework——解决跨域请求

    跨域 什么是跨域 比如一个链接:http://www.baidu.com(端口默认是80端口), 如果再来一个链接是这样:http://api.baidu.com,这个就算是跨域了(因为域名不同) 再 ...

  8. 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

    问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...

  9. springboot 前后端分离开发解决跨域访问

    最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...

随机推荐

  1. idea 项目 版本控制文件

  2. linux系统用户管理(二)

    5.组命令管理**组账户信息保存在/etc/group和/etc/gshadow两个文件中 /etc/group 组账户信息 [root@localhost ~]# head -2 /etc/grou ...

  3. winform显示word和ppt文档

    最近所做的项目中需要在Winform窗体中显示Office文档.刚开始就使用webBrowser控件实现的,但是后来发现这个控件在显示Office文档的时候有个限制:只支持Office2003之前的版 ...

  4. Linux 杀死进程方法大全(kill,killall)

    杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志.   首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:   # kill -pid   注释:标准的kill命令通常 ...

  5. iOS 仿看了吗应用、指南针测网速等常用工具、自定义弹出视图框架、图片裁剪、内容扩展等源码

    iOS精选源码 扩展内容的cell - folding-cell 一个近乎完整的可识别中国身份证信息的Demo 可自动快速... JPImageresizerView 仿微信的图片裁剪 带年月和至今以 ...

  6. 2019ICPC南京网络赛B super_log(a的b塔次方)

    https://nanti.jisuanke.com/t/41299 分析:题目给出a,b,mod求满足条件的最小a,由题目的式子得,每次只要能递归下去,b就会+1,所以就可以认为b其实是次数,什么的 ...

  7. JVM简述

    JVM的东西太多了,我们刚开始学java的时候,就会接触堆.栈,还有方法区,因为我们要知道new出来的对象放在哪里,局部变量放在哪里,static修饰的变量放在哪里. 我从网上截一个图: 这里有三大部 ...

  8. 手撸XGBoost流程(未完成)

    网上的一篇文章,讲的挺清楚的. XGBoost原理分析及实践 XGBoost的原理 xgboost原理--刘建平博客 要注意的地方: 1.预测值y(pred)和损失函数L(y,y(hat))中的y(h ...

  9. 吴裕雄--天生自然Android开发学习:魅蓝3开启USB调试

    打开手机点击:设置 选择:关于手机 在详情里面找到:版本号,然后不断地点击那个版本号. 然后返回一步 再选择设置里面的:辅助功能 再选择辅助功能里面的:开发者选项 进入开发者选项后,选择打开两项:一是 ...

  10. Jquery中$(document).ready() 和 JavaScript中的window.onload方法 比较

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的.   1.执行时间 win ...