HTTP 之 options预请求 nginx 解决跨域 postman调试跨域问题

这篇具有很好参考价值的文章主要介绍了HTTP 之 options预请求 nginx 解决跨域 postman调试跨域问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、HTTP一共有八种常见请求方法

  1. get:参数在url上,浏览器长度有限制,不安全
  2. post:参数不可见,长度不受限制
  3. put:上传最新内容到指定位置
  4. delete:删除请求的url所表示的资源
  5. head:不返回相应主体,主要用于客户端查看服务器性能
  6. options:与head类似,是客户端用于查看服务器的性能 。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限
  7. connect:http1.1预留的,将连接方式改为管道方式,通常用于SSL加密服务器的链接与 HTTP非加密的代理服务器之间的通信
  8. trace:请求服务器[回显收到的请求信息]主要用于HTTP请求的测试或诊断
  9. patch:出现的较晚,用于更新局部的资源,不存在时,会创建一个新的(http1.1之后使用的较多的)
一般来说我们只需要用到post和get,但是如果后端是ResetFul设计规范下就需要用到各种语义化的方法了

二、什么是预请求

预请求就是复杂请求(可能对服务器数据产生副作用的HTTP请求方法,如put,delete都会对服务器数据进行修改,所以要先询问服务器)。
跨域请求中,浏览器自发的发起的预请求,浏览器会查询到两次请求,第一次的请求参数是options,以检测试实际请求是否可以被浏览器接受

三、为什么需要

w3c规范要求,对复杂请求,浏览器必须先使用options发起一个预检请求,从而获知服务器是否允许该跨域请求,服务器确认以后才能发起实际的HTTP请求,否则停止第二次正式请求。

那为什么我们不常见options请求呢??
因为大部分我们使用的是get,post请求,他们属于简单请求,而简单请求不会触发options请求。
那什么情况下会发生options请求呢???👇

四、什么情况下发生(以下都属于复杂请求)

  • 请求方法不是get head post
  • post 的content-type不是application/x-www-form-urlencode,multipart/form-data,text/plain [也就是把content-type设置成"application/json"]
  • 请求设置了自定义的header字段: 比如业务需求,传一个字段,方面后端获取,不需要每个接口都传
例如设置了post请求的content-type:application/json,就会发生预请求

五、为什么需要设置成contentType:"application/json"

ajax发送复杂的json数据结构, 处理方式困难, 服务器端难以解析, 所以就有了application/json这种类型(数据格式的声明)
服务端好解析并且比较统一,如果你请求中没有设置成json格式的,有的服务端收到后也会改成json格式的,但是如果请求中就改成了json格式的就会发生options预请求

if设置了:

  • 表示json格式的字符串,发送的json对象必须使用json.stringify进行序列化字符串才能匹配
  • spring 需要使用@RequestBody来注解

if没设置:

  • 默认将使用contentType: "application/json”application/x-www-form-urlencoded

六、需要配置什么

在 CORS 中,可以使用 OPTIONS 方法发起一个预检请求,服务器基于从预检请求获得的信息来判断,以检测实际请求是否可以被服务器所接受。

1.预请求的请求报文中要设置👇

  • Access-Control-Request-Method首部字段: 告知服务器实际请求所使用的 HTTP 方法;
  • Access-Control-Request-Headers首部字段: 告知服务器实际请求所携带的自定义首部字段。

2.同时服务端或者nginx 需要设置响应体👇

"Access-Control-Allow-Origin" : * 【跨域】
Access-Control-Allow-Methods:POST,GET,OPTIONS,DELEDET 【所允许的请求方法告知客户端】
Access-Control-Allow-Headers: X-Requested-With, accept, origin, content-type【自定义的请求头】
Access-Control-Allow-Age:3600  
【一段时间内不需要再次预请求,直接用本次结果即可】
"Content-Type", "application/json;charset=utf-8"

options nginx,html,JavaScript,前端,http,nginx,postman

七、options作用

OPTIONS请求方法的主要用途有两个:

  1. 获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
  2. 用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个options请求头,用以判断实际发送的请求是否安全。

八、跨域方法

  • JSONP跨域:动态生成script标签,只支持get请求,但是兼容性比较好可以支持老浏览器
  • CORS跨源资源共享:options请求做嗅探
  • webSockted:全双工通信
  • img src :不受浏览器的同源限制

九、简单请求和非简单请求(复杂请求)

在 cors 中会有 简单请求 和 复杂请求的概念。

a.简单请求

不会触发 CORS 预检请求。这样的请求为“简单请求”,请注意,该术语并不属于 Fetch (其中定义了 CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”

情况一: 使用以下方法(意思就是以下请求以外的都是非简单请求)

  • GET

  • HEAD

  • POST

情况二: 人为设置以下集合外的请求头

  • Accept

  • Accept-Language

  • Content-Language

  • Content-Type (需要注意额外的限制)

  • DPR

  • Downlink

  • Save-Data

  • Viewport-Width

  • Width

情况三:Content-Type的值仅限于下列三者之一:(例如 application/json 为非简单请求)

  • text/plain

  • multipart/form-data

  • application/x-www-form-urlencoded

情况四:

请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。

情况五:

请求中没有使用 ReadableStream 对象。

b.非简单请求

除以上情况外的。

c.浏览器如何查看options请求

1、 在新版的 chrome 中,如果你发送了复杂请求,你却看不到 options 请求。可以在这里设置 chrome://flags/#out-of-blink-cors 设置成 disbale ,重启浏览器。对于非简单请求就能看到 options 请求了。

2、 一般情况下后端接口是不会开启这个跨域头的,除非是一些与用户无关的不太重要的接口。

十、如何在抓包工具和F12开发者工具中查看OPTION预检请求?

未完待续……

最后我把请求head的
“Content-Type”, “application/json”
改为
“Content-Type”, “multipart/form-data;”
这样没有了option预请求。

nginx下添加了请允许跨域请求

然后在postman中测试
postman调试跨域问题

  1. 在做项目的过程中经常会遇到跨域的问题,但是如果每次改了都要发到服务器上去调试,那是一件很麻烦的事情,那么有什么好的解决方法吗?当然是有的通过postman可以解决这个问题
    通过postman中header添加相关的参数就能看到是否解决问题:


options nginx,html,JavaScript,前端,http,nginx,postman

  • 这只是第一步,添加要看的参数
  • 第二步通过发送请求:这里无论有没有去解决跨域的问题请求都是不会报错的,那么如何看是否解决跨域问题呢?
  • 看返回的请求参数据就知道了:


options nginx,html,JavaScript,前端,http,nginx,postman

  • 如果说你解决了跨域的问题:


  • options nginx,html,JavaScript,前端,http,nginx,postman文章来源地址https://www.toymoban.com/news/detail-759327.html

到了这里,关于HTTP 之 options预请求 nginx 解决跨域 postman调试跨域问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx解决跨域问题

    目录 前言 一、跨域问题 1.什么是跨域  2.CORS 二、Nginx跨域处理 三.补充 这几天出现了一个问题,我们中的一个A系统需要给B系统调用,造成了跨域问题。 1.什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。  2.CORS CORS是一个W3C标准,

    2024年02月16日
    浏览(59)
  • Nginx域名重定向(如何访问的域名和实际的数据请求路径不同,可解决前端跨域)

    感情需要被抑制,不能泛滥… 当需要将一个域名重定向到另一个域名并且用户仍然看到原始域名时,Nginx是一个强大的工具。这种场景通常涉及到反向代理或重写URL的技巧。在本篇博客中,我们将详细介绍如何使用Nginx来实现这个目标,以及提供多个示例。 背景 假设您有两个

    2024年02月06日
    浏览(56)
  • 使用nginx解决跨域问题(前端解决)

    情况是这样的:编写好的前端页面本地打开是没有问题的,请求都能发出去,接收到正确的响应结果。但是,使用nginx来部署这个页面就会出现跨域问题。 跨域 :由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容 注 :同源策略,单说来就是同协

    2024年02月11日
    浏览(44)
  • 使用Nginx解决跨域问题

    目录 使用Nginx解决跨域问题 1、修改浏览器、客户端访问地址 2、在nginx.conf配置文件需配置server 3、在Nginx中配置客户端访问的接口(按照规则或通配),并设置被代理的服务器 4、在Nginx中统一配置客户端访问的头部信息(解决跨域问题) 5、在服务器端设置相应的头部信息(

    2024年02月13日
    浏览(55)
  • Nginx跨域问题的解决方法

    Web前端开发经常会遇到跨域访问,如果没有办法让后台开放访问域,调用接口就会被浏览器拦截。解决跨域问题的方案,可以搭建一个后台服务做中间转发,也可以用 nginx https://so.csdn.net/so/search?q=nginx 转发。 问题发生在nginx 反向代理 https://so.csdn.net/so/search?q=%E5%8F%8D%E5%90%91%E

    2024年02月11日
    浏览(46)
  • postman 的 console 窗口,助力 http 请求错误时的问题排查

    postman 是个很不错的 http 请求测试工具,有时我们使用它发送 http 请求,但是因为各种原因,导致请求失败,没有 response 返回,可能只有一个状态码,这让我们排查起来非常困难,比如下图所示,请求一个接口后,看不到 response,只能看到 status 是 401 unauthorized,字面意思是没

    2024年02月06日
    浏览(42)
  • 巧用Nginx配置解决跨域问题

    1,前端页面放在域名根目录,比如,http://www.xuecheng.com/ ,对应的nginx配置: 页面目录: 2,前端请求接口路径,在域名后面加一个目录 nginx 对api接口配置 其中的 $http_origin并不是nginx的内置参数,nginx支持取自定义的参数值,$http_XXX这个格式是nginx取请求中header的XXX的值的。这

    2023年04月11日
    浏览(41)
  • nginx 配置解决前端跨域问题

    一、为什么会出现跨域问题        出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略

    2023年04月22日
    浏览(50)
  • Nginx 代理解决跨域问题分析

    当你遇到跨域问题,不要立刻就选择复制去尝试。请详细看完这篇文章再处理 。我相信它能帮到你。 分析前准备: 前端网站地址:http://localhost:8080 服务端网址:http://localhost:59200  首先保证服务端是没有处理跨域的,其次,先用postman测试服务端接口是正常的。 当网站8080去

    2024年02月09日
    浏览(56)
  • nginx如何解决前后端跨域问题

    Nginx 可以通过以下两种方式来解决前后端跨域问题: 添加 CORS 头部 Nginx 可以通过添加 CORS 头部来解决跨域问题。CORS(Cross-Origin Resource Sharing)是一种机制,它允许 Web 应用程序从不同的域访问其资源。要在 Nginx 中添加 CORS 头部,可以在 Nginx 配置文件中的特定位置添加以下代

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包