java 跨域 cookie_跨域请求传递Cookie问题
问题描述
前后端完全分离的项目,前端使用Vue + axios,后端使用SpringMVC,容器为Tomcat。
使用CORS协议解决跨域访问数据限制的问题,但是发现客户端的Ajax请求不会自动带上服务器返回的Cookie:JSESSIONID。
导致每一个Ajax请求在服务端看来都是一个新的请求,都会在服务端创建新的Session(在响应消息头中设置Set-Cookie:JSESSIONID=xxx)。
而在项目中使用了Shiro框架,用户认证信息是放在Session中的,由于客户端不会把JSESSIONID返回给服务器端,因此使用Session策略存放数据的方式不可用。
原因分析
实际上,这是浏览器的同源策略导致的问题:不允许JS访问跨域的Cookie。
举个例子,现有网站A使用域名a.example.com,网站B使用域名b.example.com,如果希望在2个网站之间共享Cookie(浏览器可以将Cookie发送给服务器),那么在设置的Cookie的时候,必须设置domain为example.com。
解决方案
需要从2个方面解决:
1.服务器端使用CROS协议解决跨域访问数据问题时,需要设置响应消息头Access-Control-Allow-Credentials值为“true”。
同时,还需要设置响应消息头Access-Control-Allow-Origin值为指定单一域名(注:不能为通配符“*”)。
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
String origin = req.getHeader("Origin");
if(origin == null) {
origin = req.getHeader("Referer");
}
resp.setHeader("Access-Control-Allow-Origin", origin); // 允许指定域访问跨域资源
resp.setHeader("Access-Control-Allow-Credentials", "true"); // 允许客户端携带跨域cookie,此时origin值不能为“*”,只能为指定单一域名
if(RequestMethod.OPTIONS.toString().equals(req.getMethod())) {
String allowMethod = req.getHeader("Access-Control-Request-Method");
String allowHeaders = req.getHeader("Access-Control-Request-Headers");
resp.setHeader("Access-Control-Max-Age", "86400"); // 浏览器缓存预检请求结果时间,单位:秒
resp.setHeader("Access-Control-Allow-Methods", allowMethod); // 允许浏览器在预检请求成功之后发送的实际请求方法名
resp.setHeader("Access-Control-Allow-Headers", allowHeaders); // 允许浏览器发送的请求消息头
return;
}
chain.doFilter(request, response);
}
2.客户端需要设置Ajax请求属性withCredentials=true,让Ajax请求都带上Cookie。
对于XMLHttpRequest的Ajax请求
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.withCredentials = true; // 携带跨域cookie
xhr.send();
对于JQuery的Ajax请求
$.ajax({
type: "GET",
url: url,
xhrFields: {
withCredentials: true // 携带跨域cookie
},
processData: false,
success: function(data) {
console.log(data);
}
});
对于axios的Ajax请求
axios.defaults.withCredentials=true; // 让ajax携带cookie
java 跨域 cookie_跨域请求传递Cookie问题相关推荐
- 跨域请求传递Cookie
通过CORS跨域时,浏览器不会自动带上cookie.想要传递cookie,需要客户端与服务端共同设置. 服务端需要设置 Access-Control-Allow-Origin 该字段表明服务端接收哪些 ...
- ajax跨域请求传递Cookie问题
问题描述 前后端完全分离的项目,前端使用Vue + axios,后端使用SpringMVC,容器为Tomcat. 使用CORS协议解决跨域访问数据限制的问题,但是发现客户端的Ajax请求不会自动带上服 ...
- ajax跨域请求及传递cookie
一.ajax跨域访问 先要搞清楚什么是ajax跨域.看如下例子即可明白: 网站A:a.test.com 通过ajax请求网站B:b.test.com上的接口,很明显网站A和网站B 是两个不同的域,而处 ...
- jmeter学习指南之深入分析跨域传递cookie
继上篇文章中介绍了Jmeter cookie manager的两种常用使用情况: jmeter视频:https://edu.51cto.com/course/14305.html 同一线程组和不同线程 ...
- vue-resource ajax跨域,ajax 跨域请求 vue-resource jsonp跨域
aj体朋几一级发等点确层数框的很屏果行4带域ax 跨域请求 vue-resource j直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如数围请sonp跨域 最近在学习vue.js 碰到个ajax ...
- Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)
阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...
- java 服务端 处理跨域_javaweb服务端跨域支持
项目开发为了支持web浏览器ajax的直接请求,涉及到了跨域的需求,通过学习对跨域有了更深入的认识,现在总结一下: 1.跨域说明 跨域指请求和服务的域不一致,浏览器和H5的ajax请求有影响,而对服务 ...
- ajax跨域jsonp并且post请求No 'Access-Control-Allow-Origin'以及执行error时readyState=4同时status=200的解决方法
ajax跨域jsonp并且post请求No 'Access-Control-Allow-Origin'以及执行error时readyState=4同时status=200的解决方法 [网上很多网友的回 ...
- 跨域传递cookie
cookie基本使用 首先,需要在服务端返回的头部信息中增加: response.setHeader("Access-Control-Allow-Origin","htt ...
最新文章
- 如何在AxureRP7中使用FontAwesome字体
- python3中map函数_解决Python3下map函数的显示问题
- (原创) 电源滤波为何要用几个不同量级的电容并联?
- The C10K problem
- libz.so.1: cannot open shared object file: No such file or directory
- 腾讯云与同方全球人寿签署战略合作 “云+保险”合作伙伴队伍再壮大
- 计算机桌面界面组成,win10桌面添加分类框,电脑桌面归纳小窗口
- 短视频拍摄脚本怎么写
- 人工神经元网络及其应用,现有的人工神经元网络
- 用平面图片制作3D模型【3DsMax】
- MATTEO ZANGA网页JS功能实现
- 宏定义时对整数进行数据类型定义
- 方舟生存进化服务器文件设置,方舟生存进化私人服务器设置教程[多图]
- 《笔记——机器学习与物理模型》by鄂维南院士讲座
- 用python对某校园热水服务app进行测试,实现自动免费用水(仅供参考)
- Uber 团队放弃微服务改用宏服务,网友评论炸锅了
- python第三章练习题
- js 模拟短信发送 JavaScript
- js 分析——百度模拟登录(二)
- 初体验python图片识别文字【Tesseract】OCR技术
热门文章
- B2B策划书:在线B2B行业小额批发平台
- 阿里巴巴离职DBA在35岁总结的职业生涯(转)
- 计算机可以玩游戏吗教程,怎么在电脑上玩ios游戏_电脑上玩ios游戏教程_飞翔教程...
- 荣耀7x Android8,荣耀7X升级安卓8.0
- Android 自定义Switch样式
- c语言计算圆球体积r为整数,c语言 设圆球的半径为r,计算并输出圆球的体积v.输出结果...
- 计算圆球体积的c语言PTA,c语言程序设计教学课件2013韩立毛徐秀芳书后练习学习题参考-答案~.doc...
- matlab在线性代数中的应用开题报告,矩阵应用开题报告.doc
- 解析蓝牙模块的运用方案
- UML九种图之动态图