前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等
前言
在前后端没有分离的时候,前端开发要么是写静态页面,数据渲染后端来做,要么就是前端的页面和后端的代码刚开始的时候就合并在一起,每次后端代码更新了之后,前端也要更新一下代码,然后重启一下服务,还是比较麻烦的,而且前端要一直依赖于后端来开发。但前后端分离之后就不一样了,前端有更大的自由发挥性,现在应该绝大部分的公司都已经采取这种开发模式了。
前后端分离开发之后前后端只要定好接口文档,然后就根据文档各自开始开发了,在接口没好之前前端也可以使用模拟数据的插件来做接口数据模拟返回,等到后端接口写好之后再进行联调就好了,这样子又为开发大大的节约了时间。
前后端为我们带来那么大的便利,但也有它随之而来的缺点,那就是在项目开发时去请求同事的服务,由于浏览器同源策略的影响,就会出现跨域问题而无法收到后端接口返回的数据。
那么何种情况下算跨域了呢?
-
- http://www.qq.com/a.html ----- 域名不同
- http://www.baidu.com:8080/a.html ----- 端口不同
- http://baike.baidu.com/a.html ----- 子域不同
- https://baidu.com/a.html ----- 协议不同
跨域之后会造成
我们使用ajax去请求资源的时候,就会被使用同源策略进行检测,注意:同源策略是适用于浏览器的,也就是说如果我们发送了一个跨域的请求,服务器是能接收到请求的,也会把请求的数据返回给你,但浏览器在接收数据之后,会比较他们的域是否相同,如果不相同拒绝接收处理。
解决方案
1:后端代理
1.1 vue里的后端代理
在config文件下的index.js文件下配置:
proxyTable: {
'api':{//将'http://www.test.com:8001/'映射为'api'
target:'http://www.test.com:8001/',// 接口域名
changeOrigin: true,//是否跨域
pathRewrite: {
'^/apis': '' //需要rewrite的,
}
},
}
1.1 nginx代理
找到nginx里conf下的配置文件nginx.conf,进行以下的修改
server {
listen 80; #监听80端口,可以改成其他端口
server_name 127.0.0.1; # 当前服务的域名
#charset koi8-r;
#access_log logs/host.access.log main;
location ^~/ {
proxy_pass http://127.0.0.1:4302; #页面访问地址
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}
location ^~/hs {
proxy_pass http://10.65.7.114:8180/hs; #实际请求的接口配置
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}
}
注:在location里面配置页面的访问地址和要请求的接口地址。
2:jsonp请求
原理:我们会发现我们用script来引入文件的时候,地址不受同源策略的影响
2.1原生js解决跨域
<script>
function callback(res){
console.log(res.name);
}
</script>
<script src="http://www.baidu.com/api.do?callback=callback"></script>
2.2用juery封装好的jsnop请求来解决跨域
$.ajax({
url: "http://www.baidu.com/api.do",
type: "GET",
dataType: "jsonp", //指定服务器返回的数据类型
success: function (res) {
console.log(res);
}
});
jsonp请求的缺点就是它只能发送get请求,有上传文件之类的需求就不适合用。
3:设置头信息方案
js 端的ajax请求:
$.ajax({
url:'http://test.html',
dataType:'json',
type:'GET',
beforeSend:function(xhr){
xhr.setRequestHeader('Test','testheadervalue');
},
async: false,
cache: false,
success: function (res) {}
})
服务端设置:
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
/**表示的是访问服务端的ip地址及端口号,设置为*表示所有域都可以通过,一般来说不设置*,因为安全性能差,所以改成*/--->HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://10.80.6.111:8080");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,DELETE,PUT");
/**表示的是允许跨域的请求方法;*/
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Test");
/**表示的是允许跨域请求包含content-type头;*/
前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等的更多相关文章
- 前后端分离 vue+springboot 跨域 session+cookie失效问题
环境: 前端 vue ip地址:192.168.1.205 后端 springboot2.0 ip地址:192.168.1.217 主要开发后端. 问题: 首先登陆成功时将用户存在session ...
- 前后端分离crud(跨域问题)讲解
1 前后端分离 1.1 后端 ssm+maven 多模块 swagger 文档描述(代码拷贝过来,就可以生成了,https://www.cnblogs.com/wings-xh/p/11991511. ...
- 【坑】前后端分离开发中 跨域问题以及前台不带cookie的问题
文章目录 前言 跨域问题 cookie问题 拦截器导致的跨域问题 后记 前言 场景一: 前台哒哒哒的点击页面,发送请求,但是后台服务器总是没有回应,后台接口虽打了断点,但是根本进不到断点处: 前端:我 ...
- 前后端分离开发,跨域时jsessionid每次请求都变化的问题解决方法
本解决方法的使用前提是,前端开发使用的是vue,后端使用java(SpringMVC) 在前后端分离开发过程中,可能会出现因跨域而导致每次请求的jsessionid不一致的情况 解决方法: 前端:要在 ...
- Vue+SpringBoot前后端分离中的跨域问题
在前后端分离开发中,需要前端调用后端api并进行内容显示,如果前后端开发都在一台主机上,则会由于浏览器的同源策略限制,出现跨域问题(协议.域名.端口号不同等),导致不能正常调用api接口,给开发带来不 ...
- 前后端分离djangorestframework——解决跨域请求
跨域 什么是跨域 比如一个链接:http://www.baidu.com(端口默认是80端口), 如果再来一个链接是这样:http://api.baidu.com,这个就算是跨域了(因为域名不同) 再 ...
- springboot 前后端分离开发解决跨域访问
最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...
- 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题
问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...
- 前后端分离下的跨域CAS请求
最重要的两点: ajax请求跨域的时候,默认不会携带cookie. 请求分为普通请求(HttpRequest)和Ajax请求(XMLHttpRequest) 先屡一下跨域CAS认证的流程: 前端发起a ...
随机推荐
- think--数据库的设置
1.在项目下的Common下的Conf下的config.php 配置: 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'localhost', / ...
- Ubuntu 安装 Qt, 安装辅助软件
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev sudo apt-get install gcc g++ sudo apt-get inst ...
- Spring Boot 之Spring data JPA简介
文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...
- 如何在Spring boot中修改默认端口
文章目录 介绍 使用Property文件 在程序中指定 使用命令行参数 值生效的顺序 如何在Spring boot中修改默认端口 介绍 Spring boot为应用程序提供了很多属性的默认值.但是有时 ...
- 美版健康码要来了!苹果Google被网友质疑:这是变相的监视系统吗?
4 月 30 日消息,据外媒报道,由苹果和谷歌合作开发一个冠状病毒追踪系统将在 5 月 1 日正式上架,今天已经进入测试阶段. 图自:techcrunch 这款应用可以让 iOS 和 Android ...
- 已有项目接入git远程仓库
1.项目根目录初始化git仓库 git init 2.将本地项目与远程仓库关联(首先得在远程创建一个代码仓库) git remote add origin 远程仓库地址 诺,仓库地址就是这个玩意 3. ...
- POJ2155/LNSYOJ113 Matrix【二维树状数组+差分】【做题报告】
这道题是一个二维树状数组,思路十分神奇,其实还是挺水的 题目描述 给定一个N∗NN∗N的矩阵AA,其中矩阵中的元素只有0或者1,其中A[i,j]A[i,j]表示矩阵的第i行和第j列(1≤i,j≤N)( ...
- 限流 - Guava RateLimiter
2019独角兽企业重金招聘Python工程师标准>>> 限流 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦并发访问/请求达到限制速率或者 ...
- Linux环境下,MongoDB 3.6.10 的安装步骤,以及设置用户和密码,配置随处执行mongo命令启动客户端,以及所遇到的问题
https://blog.csdn.net/qinaye/article/details/87920651 二.设置MongoDB用户和密码2.1 利用./mongo命令连接mongoDB客户端../ ...
- Codeforces Round #622 (Div. 2) 1313 A
Tired of boring office work, Denis decided to open a fast food restaurant. On the first day he made ...