zoukankan      html  css  js  c++  java
  • WebApi2跨域问题

    一、跨域问题产生的原因:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能。

    现在所有支持JavaScript 的浏览器都会使用这个策略。
    所谓同源是指,域名,协议,端口相同。
    当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面
    当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,
    即检查是否同源,只有和百度同源的脚本才会被执行。
    由于同源策略的限制,JavaScript就产生了跨域的问题。
    参考:同源策略
     
    二、在WebApi2中的解决方法。
    环境:vs2013,entity framework 6.0
    后端项目:webApi 2
    前端项目:
    提交ajax时候用的类型:application/json
    1、在nuget中搜索cors,安装

    2、在文件WebApiConfig.cs中配置跨域设置

    3、因为前端提交ajax请求,用的类型是application/json。发送post请求前会先发送一个预请求,就是option请求。

    要在Web.config中配置下处理option请求,让后端能够正确的响应option请求,前端才会继续发送post请求。

    这两个处理程序会影响option请求的正确处理。

    1  <system.webServer>
    2      <handlers> <!--此处处理options请求。或去iis里面删除、添加上动作添加上OPTIONS-->
    3       <remove name="OPTIONSVerbHandler" />
    4       <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    5       <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    6     </handlers>
    7     
    8   </system.webServer>

    1、默认的配置:

    var cors = new EnableCorsAttribute("*", "*", "*");

                config.EnableCors(cors);

    这样设置可以实现简单请求的跨域,

    但是非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUTDELETE,或者Content-Type字段的类型是application/json非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。options请求。

    触发options请求的条件:

    1、非GET 、POST请求

      2、POST请求的content-type不是常规的三个:application/x- www-form-urlencoded(使用 HTTP 的 POST 方法提交的表单)、multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)、text/plain(纯文本)

      3、POST请求的payload为text/html

      4、设置自定义头部

    但是不能实现非简单请求的跨域。

    还需要在web.config<system.webServer>添加

    <handlers>

          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

          <remove name="OPTIONSVerbHandler" />

              <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

    </handlers>

    注意

    var cors = new EnableCorsAttribute("10.116.56.69:90", "*", "*");

    是不行的 ,要写http://10.116.56.69:90

    注意:如果写http://localhost:90  ,那浏览器访问的时候也要访问 http://localhost:90,如果访问http://10.116.56.69:90,也是不能跨域的。

  • 相关阅读:
    Linux的web服务的介绍
    Linux的DNS主从服务器部署
    K8S Calico
    K8S flannel
    K8S dashboard
    K8S RBAC
    kubernetes认证和serviceaccount
    K8S 部署 ingress-nginx (三) 启用 https
    K8S 部署 ingress-nginx (二) 部署后端为 tomcat
    K8S 部署 ingress-nginx (一) 原理及搭建
  • 原文地址:https://www.cnblogs.com/heifengwll/p/6243374.html
Copyright © 2011-2022 走看看