前端请求报错:Access-control-Allow-Origin
产生跨域问题的原因
1.浏览器限制,浏览器处于安全考虑。(后台可以正常被调用,前台会收到返回值)(被调用方配置,告诉浏览器允许调用方调用----支持跨域)
2.跨域,ip、端口跨域(Nginx代理---隐藏跨域)
3.XHR(XMLHttpRequest)请求,浏览器才做拦截。对于JSON请求,可以正常跨域请求。(dataType=JSONP)
JSONP方式:
前台请求dataType=“jsonp” ,后台要定义callback约定,后台通过约定校验,将返回数据,转换成js脚本(创建script标签脚本,将返回值插进去)。
缺点:
1.服务端也需要改动,如果被调用方不是我们自己的代码,就无法实现。
2.只支持GET(原因是url要拼接callback参数)
3.不能发送XHR请求(异步、事件)
被调用方支持跨域方式:
①应用服务器中修改响应头
简单请求(先执行后判断)和非简单请求(预检命令后执行)
1.新建过滤器
2.获取Origin请求头String origin = req.getHeader("Origin");
3.在过滤器函数中添加过滤信息
res.addHeader("Access-Control-Allow-Origin", origin); //带cookie请求的时候不能用,要用origin,在这里指定调用方ip和端口。即res.addHeader("Access-Control-Allow-Origin", http://172.168.1.1:8081);
res.addHeader("Access-Control-Allow-Methods", "");//所有方法
res.addHeader("Access-Control-Allow-Headers", Content-Type);//缓存响应头,防止每次请求都是两次
res.addHeader("Access-Control-Max-Age", "3600");//设置缓存时长
res.addHeader("Access-Control-Allow-Credentials", "true");//带cookie请求要加
chain.doFilter(request, response);
带cookie的请求,浏览器获取cookie只能获取本域的,浏览发送的cookie要是被调用方的cookie,不能获取跨域cookie,所以要在被调用方加上cookie信息。
②利用Nginx(也可以用Apache)基于虚拟主机修改响应头
③Spring框架解决方案
在被调用方的Controller类或方法上添加@CrossOrigin
调用方隐藏跨域方式:
调用方Http服务的方向代理
Nginx或Apache配置(目的就是增加一个虚拟主机)
隐藏跨域调用方的请求地址必须是相对地址。
就与Nginx或Apache配置的方式,可以针对非java语言开发应用的跨域解决。
解决Ajax跨域请求
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。