为什么postman调接口不会跨域而浏览器会?

都在说跨域,为什么postman能访问接口,而浏览器就不行呢?这里需要理解什么是跨域,跨域是指的当前资源访问其他资源时发起的http请求由于安全原因(由于同源策略,域名、协议。端口中只要有一个不同就不同源),浏览器限制了这些请求的正常访问,特别需要注意的是这些发生在浏览器中。而通过postman等工具调用接口时,只是简单的访问一个资源,并不存在资源的相互访问。

知识预热

回调函数

这里就不细讲回调函数啦,相信各位都能理解,用一个案例来说一下。

“服务器”和“客户端”初次相识,相谈甚欢,客户端希望服务器把一个叫json的东西给它,”服务器“:你先忙着,我弄好了发给你,把你电话号码(回调函数)给我。

跨域中的预检请求即是指浏览器在真正发送请求前,会先发送一个Options请求嗅探,请求成功后才会发送真实的请求。问答三连:

为什么需要发送预检请求?是因为触发了浏览器的安全校验。

为什么请求会触发安全校验?因为当前请求是一个"复杂请求"。

为什么我的请求是“复杂的”?见下面解释

复杂和简单请求

简单请求:请求方法是GET/HEAD/POST,并且contentType为text/plain、application/x-www-form-urlencoded、multipart/form-data。

不满足上述条件的视为复杂请求,开发中我们常触发这个条件大多因为我们的请求的contentType设置的是application/json导致的。

简单请求如果设置了Authentication认证header也会让请求“升级”为复杂请求。

理解spring提供的@CrossOrigin注解

@CrossOrigin(maxAge = 3600,origins = "*")

@CrossOrigin可以放在某个方法上,或者放在类上,这样对类中所有请求方法有效,指定能访问的域集合,即是设置Access-Control-Allow-Origin。

maxAge 属性指定了预检请求的缓存时间,单位是秒。对应http的Access-Control-Max-Age属性

缓存的内容为:Access-Control-Allow-Methods和Access-Control-Allow-Headers 提供的信息。

理解使用jsonp解决跨域问题

上面简单介绍了回调函数,jsonp是如何解决跨域的呢?其实就是利用了一个特性,html页面中引入不同域的js是不会引发跨域的,下面的案例中,我引入了一个在线的query地址,并且在script标签的src写上了后端的接口地址,从前端的角度我们可以想象成只是简单请求一个js文件,js文件的内容是一个函数调用,刚好浏览器本地定义了这个函数,所以请求完毕,就会对这个函数发起调用,当然前后端的函数名需要一样,这就是我们说的回调函数的机制。

前端

init...

//定义回调函数,相当于上述说的“电话号码”

function myCallback(res){

alert(JSON.stringify(res));

}

--------------------------------------------------------------------------------

后端:

/**

* 返回 使用回调函数包裹的json

* @return

*/

@RequestMapping("/infoWithCallBack")

public String info(){

JSONObject map = new JSONObject();

map.put("msg","请求成功!");

map.put("code","0000");

map.put("data","获取到后端数据!");

String str = map.toString();

return "myCallback(" + str + ")";

}

上面的例子在正常返回的json前面包裹了一个函数名,为的是能让浏览器执行,如果不采用jsonp的方式,而是后端设置Access-Control-Allow-Origin,则请求到的不是一个标准json,所以我们需要改造一下,兼容两种方式。

$(function(){

$.ajax({

type:'POST'

,dataType:"jsonp"

,url:'http://localhost:9992/cors/info3'

,data:{}

,contentType:'application/json;charset=utf-8'

//,jsonp:"callback" //指定回调函数的名字。一般不改这个,默认callback

//,jsonpCallback:"myCallback" //手动执行发送给服务器的callback参数名,否则由jquery自动帮我们生成,类似jQuery17207352806672191685_1544278219377

,success:function(data){

debugger;

alert("ajax: "+JSON.stringify(data));

}

});

}

--------------------------------------------------------------------------------

/**

* 3.兼容jsonp和普通json请求

* @return

*/

@RequestMapping("/info3")

public String info3(@RequestParam(name="callback",required = false) String callBack){

JSONObject map = new JSONObject();

map.put("msg","请求成功!");

map.put("code","0000");

map.put("data","获取到后端数据!");

String result = map.toString();

if(!StringUtils.isEmpty(callBack)){

//如果是json请求,则包裹上回调函数

return callBack + "(" + result + ")";

}

return result;

}

其他遇到的问题

Uncaught SyntaxError: Unexpected token :

在解决跨域时,遇到这种错误,一般是前端没有设置回调函数,而后端返回了被回调函数包裹的json.

info?callback=callback:1 Uncaught ReferenceError: callback is not defined

at info?callback=callback:1

本文分享 CSDN - 独行侠梦。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

postman不跨域 本地开发跨域_为什么postman调接口不会跨域而浏览器会相关推荐

  1. nuxt.js 本地开发跨域问题(Access-Control-Allow-Origin)及其解决方案

    问题描述 现在 web 开发都是前后端分离的年代,前后端分离的好处我就不啰嗦了,进入问题 ==>>> 使用 nuxt.js 本地开发 Vue 项目时,ajax 请求时可能会遇到跨域问 ...

  2. 全局组、域本地组、通用组到底有什么区别?它们之间的关系如何?

    全局组:可以全局使用.即:可在本域和有信任关系的其它域中使用,体现的是全局性.MS建议的规则:基于组织结构.行政结构规划. 域本地组:只能在本域的域控制器DC上使用.MS建议的规则:基于资源(夹.打印 ...

  3. [基础]全局组、域本地组、通用组的区别与联系

    很多初级网管员对全局组.域本地组.通用组之间区别.关系比较模糊.对于这个问题我们首先要明确全局组.域本地组.通用组的的作用范围. 全局组:可以全局使用.即:可在本域和有信任关系的其它域中使用,体现的是 ...

  4. 19条跨端cpp开发有效经验总结

    跨多端开发避坑指南 前言 细想,专门从事跨多端开发已两年有余,前段时间因为组里跨桌面端项目需要回归windows下开发了整整2个月,怎么形容这两个月呢,嘿嘿,各种"肆无忌惮"的写法 ...

  5. 本地跨域处理ajax,Node.js配合node-http-proxy解决本地开发ajax跨域问题

    情景: 前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法: 1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. ...

  6. vue-webpack项目本地开发环境设置代理解决跨域问题

    vue-webpack项目本地开发环境设置代理解决跨域问题 参考文章: (1)vue-webpack项目本地开发环境设置代理解决跨域问题 (2)https://www.cnblogs.com/xyyt ...

  7. 本地开发代理、解决跨域、虚拟域名

    概述 虚拟本地域名: 1.host 做map映射,注意端口号 2.charles.fiddler代理虚拟域名 常见本地开发解决代理方案三种: 1.chrome extensions 扩展程序(cors ...

  8. uni-app跨域的解决以及如何封住api,请求接口

    uni-app跨域的解决以及如何封住api,请求接口 let request = function(url, data = {}, method = "GET") {return ...

  9. 跨域的另一种解决方案CORS(CrossOrigin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  10. iframe 跨域_【梯云纵】搞定前端跨域

    韦陀掌法,难陀时间善恶:梯云纵,难纵过乱世纷扰. 现在开始写代码o(╯□╰)o 什么是跨域 1.跨域的定义 广义的跨域是指一个域下对的文档或者脚本试图去请求另外一个域下的资源. a链接.重定向.表单提 ...

最新文章

  1. 百变应用场景下,优酷基于图执行引擎的算法服务框架筑造之路!
  2. 使用李天平代码生成器中分页存储过程的问题
  3. Mastering Android NDK Build System - Part 2: Standalone toolchain
  4. C语言试题二十三之编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中
  5. ConcurrentHashMap是如何保证线程安全的,你知道么?
  6. 向Maven的本地库中添加jar文件
  7. 数据结构--严蔚敏(C语言版)笔记
  8. 【2021】重装ubuntu16.04系统
  9. Python exe Fatal error detected
  10. bzoj3786 星系探索(ETT)
  11. Visium空间转录组
  12. python工程师怎么考-【一个合格的Python工程师需要达到怎样的编程水平】
  13. Windows打印管理解决方案
  14. 厉害了,大学生制作的学校三维实景模型
  15. 北航计算机学院编译技术,北航编译技术在线作业一二三
  16. 说说CAP 理论是什么?
  17. 超松弛迭代法求解二维电磁场有限差分方程(附Matlab代码)
  18. Linux7.6安装Vnc
  19. 一、Python的应用场景
  20. SegNet-论文笔记-理解

热门文章

  1. 会打飞机吗?原来用 Python 实现打飞机更爽
  2. 美国卡内基梅隆大学计算机排名,美国卡内基梅隆大学世界排名情况
  3. oracle 数据库不用了,改用SQL,要学SQL了,第一个手工写的存储过程
  4. 男人的消费观连狗都不如
  5. LeetCode | 面试题04. 二维数组中的查找【剑指Offer】【Python】
  6. Linux debian解压和压缩.rar文件教程
  7. 逝去的2018年,年度总结
  8. 腾讯视频显示网络连接服务器失败,腾讯视频网络连接异常
  9. selenium页面跳转问题-QQ邮箱登录之后找不到元素
  10. 华为云Centos7搭建hadoop集群一:云服务器准备