美文网首页
发送跨域请求返回405错误问题

发送跨域请求返回405错误问题

作者: 木白no1 | 来源:发表于2017-09-15 20:36 被阅读1063次

1、跨域请求

从本域名访问不同域名或端口的http请求统一称为跨域请求,为了安全起见,浏览器会阻止从脚本中(比如js、css)发起http跨域请求,但资源以嵌入的方式是可以加载的。

以下是可能嵌入跨源的资源的一些示例:

  • <script src="..."></script>标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到。
  • <link rel="stylesheet" href="...">标签嵌入CSS。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的Content-Type消息头。不同浏览器有不同的限制:
    IE, Firefox, Chrome, Safari (跳至CVE-2010-0051)部分 和 Opera
  • <img>嵌入图片。支持的图片格式包括PNG,JPEG,GIF,BMP,SVG,...
  • <video> 和 <audio>嵌入多媒体资源
  • <object>,<embed>和<applet>的插件
  • @font-face
    引入的字体。一些浏览器允许跨域字体( cross-origin fonts),一些需要同源字体(same-origin fonts)。
  • <frame>
    <iframe>载入的任何资源。站点可以使用
    X-Frame-Options消息头来阻止这种形式的跨域交互。

非嵌入式http跨域请求分两种:

  • 简单请求
    简单请求需要满足三个条件:
    • 请求的methods仅限于GET、HEAD、POST
    • Content-Type头值必须为text/plain|multipart/form-data|application/x-www-form-urlencoded其中之一
    • 请求头部不可以添加额外的头部

此类请求只是简单的发送请求,是否能成功,需要服务器端配置Access-Control-Allow-Origin: yourDomain | *

  • 预检请求
    与前述简单请求不同,“需预检的请求”要求必须首先使用 OPTIONS
    方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响
    简单请求需要满足三个条件:
    • 请求的methods为PUT 、DELETE 、CONNECT 、OPTIONS 、TRACE 、PATCH中任一种HTTP方法
    • Content-Type头值不为text/plain|multipart/form-data|application/x-www-form-urlencoded其中之一
    • 请求头部添加了额外的头部

所谓预检请求,就是在正式请求发送之前,先发送一个OPTIONS请求去服务器询问服务器是否处理正式请求的method以及带的headers,如果处理,那就发送正式请求,否则报错 code 405。
比如发送一个跨域的get请求,但是添加了一个headers: {myheader: true}, 这样满足了预检请求的条件,浏览器拦截到该get请求后,检查到headers中有额外headers,那么就会自己先发一个OPTIONS请求,带上get请求的method与headers去访问服务器。

2、跨域请求需要带上cookie

当发送跨域请求时,有时需要带上cookie或者其他证书去认证,需要在前端请求headers中添加withCredentials:true,这样才会带上cookie,并且服务器端的响应中需携带 Access-Control-Allow-Credentials: true,否则浏览器将不会把响应内容返回给请求的发送者。

注意,对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“*”。
这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为http://yourhost.com,则请求将成功执行。
另外,响应首部中也携带了 Set-Cookie 字段,尝试对 Cookie 进行修改。如果操作失败,将会抛出异常。

参考:
1、浏览器的同源策略
2、HTTP访问控制(CORS)
3、前后端通讯系统
4、web font 字体跨域

相关文章

  • 发送跨域请求返回405错误问题

    1、跨域请求 从本域名访问不同域名或端口的http请求统一称为跨域请求,为了安全起见,浏览器会阻止从脚本中(比如j...

  • axios发送俩次请求的原因

    其实跨域分为简单跨域请求和复杂跨域请求 简单跨域请求是不会发送options请求的 复杂跨域请求会发送一个预检请求...

  • axios 跨越配置代理后 post 405 get正常

    跨域配置如下: 之后请求,发现post请求报405错误,get请求正常,原因: 笔者项目web.xml中配置拦截器...

  • node.js处理post请求

    注意:浏览器只能发送get请求,那如何发送post请求呢?发送post请求可以手写ajax请求,但是有跨域问题!所...

  • vue发送请求(axios + vue-resource)

    axios本身并不支持发送跨域的请求,使用vue-resource发送跨域请求。 vue-resource基本使用...

  • 跨域

    1、跨域是什么 域指的是域名,向一个域发送请求,如果请求的域和当前域是不同域,就叫跨域;不同域之间的请求就叫跨域请...

  • 跨域访问的解决方法

    跨域访问是什么,百度一下你就知道。 什么情况下能确定遇到跨域问题了呢? 是使用js向服务起发送的请求 没有返回结果...

  • 登录校验302重定向跳转时报跨域错误

    某个请求校验未登录返回302重定向跳转时报跨域错误。请求头中有'X-Requested-With': 'XMLHt...

  • 简单请求和非简单请求1

    简单请求和非简单请求1 1、浏览器发送跨域请求,如何判断? 浏览器在发送跨域请求的时候,会先判断下是简单请求还是非...

  • fetch、axios的跨域配置

    fetch默认不携带cookie etch发送请求默认是不发送cookie的,不管是同域还是跨域;那么问题就来了,...

网友评论

      本文标题:发送跨域请求返回405错误问题

      本文链接:https://www.haomeiwen.com/subject/xyjssxtx.html