问题描述

前后端完全分离的项目,前端使用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问题相关推荐

  1. 跨域请求传递Cookie

    通过CORS跨域时,浏览器不会自动带上cookie.想要传递cookie,需要客户端与服务端共同设置. 服务端需要设置 Access-Control-Allow-Origin 该字段表明服务端接收哪些 ...

  2. ajax跨域请求传递Cookie问题

    问题描述 前后端完全分离的项目,前端使用Vue + axios,后端使用SpringMVC,容器为Tomcat. 使用CORS协议解决跨域访问数据限制的问题,但是发现客户端的Ajax请求不会自动带上服 ...

  3. ajax跨域请求及传递cookie

    一.ajax跨域访问 先要搞清楚什么是ajax跨域.看如下例子即可明白: 网站A:a.test.com 通过ajax请求网站B:b.test.com上的接口,很明显网站A和网站B 是两个不同的域,而处 ...

  4. jmeter学习指南之深入分析跨域传递cookie

    继上篇文章中介绍了Jmeter cookie manager的两种常用使用情况: jmeter视频:https://edu.51cto.com/course/14305.html 同一线程组和不同线程 ...

  5. vue-resource ajax跨域,ajax 跨域请求 vue-resource jsonp跨域

    aj体朋几一级发等点确层数框的很屏果行4带域ax 跨域请求 vue-resource j直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如数围请sonp跨域 最近在学习vue.js 碰到个ajax ...

  6. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)

    阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...

  7. java 服务端 处理跨域_javaweb服务端跨域支持

    项目开发为了支持web浏览器ajax的直接请求,涉及到了跨域的需求,通过学习对跨域有了更深入的认识,现在总结一下: 1.跨域说明 跨域指请求和服务的域不一致,浏览器和H5的ajax请求有影响,而对服务 ...

  8. 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的解决方法 [网上很多网友的回 ...

  9. 跨域传递cookie

    cookie基本使用 首先,需要在服务端返回的头部信息中增加: response.setHeader("Access-Control-Allow-Origin","htt ...

最新文章

  1. 如何在AxureRP7中使用FontAwesome字体
  2. python3中map函数_解决Python3下map函数的显示问题
  3. (原创) 电源滤波为何要用几个不同量级的电容并联?
  4. The C10K problem
  5. libz.so.1: cannot open shared object file: No such file or directory
  6. 腾讯云与同方全球人寿签署战略合作 “云+保险”合作伙伴队伍再壮大
  7. 计算机桌面界面组成,win10桌面添加分类框,电脑桌面归纳小窗口
  8. 短视频拍摄脚本怎么写
  9. 人工神经元网络及其应用,现有的人工神经元网络
  10. 用平面图片制作3D模型【3DsMax】
  11. MATTEO ZANGA网页JS功能实现
  12. 宏定义时对整数进行数据类型定义
  13. 方舟生存进化服务器文件设置,方舟生存进化私人服务器设置教程[多图]
  14. 《笔记——机器学习与物理模型》by鄂维南院士讲座
  15. 用python对某校园热水服务app进行测试,实现自动免费用水(仅供参考)
  16. Uber 团队放弃微服务改用宏服务,网友评论炸锅了
  17. python第三章练习题
  18. js 模拟短信发送 JavaScript
  19. js 分析——百度模拟登录(二)
  20. 初体验python图片识别文字【Tesseract】OCR技术

热门文章

  1. B2B策划书:在线B2B行业小额批发平台
  2. 阿里巴巴离职DBA在35岁总结的职业生涯(转)
  3. 计算机可以玩游戏吗教程,怎么在电脑上玩ios游戏_电脑上玩ios游戏教程_飞翔教程...
  4. 荣耀7x Android8,荣耀7X升级安卓8.0
  5. Android 自定义Switch样式
  6. c语言计算圆球体积r为整数,c语言 设圆球的半径为r,计算并输出圆球的体积v.输出结果...
  7. 计算圆球体积的c语言PTA,c语言程序设计教学课件2013韩立毛徐秀芳书后练习学习题参考-答案~.doc...
  8. matlab在线性代数中的应用开题报告,矩阵应用开题报告.doc
  9. 解析蓝牙模块的运用方案
  10. UML九种图之动态图