zoukankan      html  css  js  c++  java
  • Web API 跨域问题解决方案:CORS

    • 同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容
    • 跨域问题:因为同源策略,所以我们不同项目之间的调用会被浏览器所阻止
    • 解决原理:采用CORS(Cross-Origin Resource Sharing,跨域资源共享),主要是通过向Http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求,例如向响应报文里面增加这个Access-Control-Allow-Origin:http://localhost:8081,就表示支持http://localhost:8081里面的所有请求访问系统资源
    • 对于下列四种方法中的三个类似参数originsheadersmethods
      • origins配置允许访问的域名,多个域名以逗号分隔即可,域名一定要完整,如果是ip地址前面要加上“http”,只使用IP的话一定会失效的
      • headers配置所支持的资源
      • methods配置支持的方法:GET, POST, PUT, DELETE, OPTIONS等
    • 第一种:配置文件Web.Config解决方法
    1 <system.webServer>
    2   <httpProtocol>
    3     <customHeaders>
    4       <add name="Access-Control-Allow-Origin" value="*" />
    5       <add name="Access-Control-Allow-Headers" value="Content-Type" />
    6       <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    7     </customHeaders>
    8   </httpProtocol>
    9 </system.webServer>
    • 第二种:使用CORS跨域,在NuGet程序包中下载"microsoft.aspnet.webapi.cors"
     1 public static class WebApiConfig//App_Start文件夹
     2 {
     3     public static void Register(HttpConfiguration config)
     4     {
     5         //跨域配置
     6         config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
     7         // Web API 路由
     8         config.MapHttpAttributeRoutes();
     9         config.Routes.MapHttpRoute(
    10             name: "DefaultApi",
    11             routeTemplate: "api/{controller}/{id}",
    12             defaults: new { id = RouteParameter.Optional }
    13         );
    14     }
    15 }
    • 第三种:在第二种的基础上进行改良
    1 <appSettings>//Web.Config
    2     <add key="cors_allowOrigins" value="*"/>
    3     <add key="cors_allowHeaders" value="*"/>
    4     <add key="cors_allowMethods" value="*"/>
    5 </appSettings>
     1 public static class WebApiConfig//App_Start文件夹
     2 {
     3     public static void Register(HttpConfiguration config)
     4     {
     5         //跨域配置
     6         var allowOrigins = ConfigurationManager.AppSettings["cors_allowOrigins"];
     7         var allowHeaders = ConfigurationManager.AppSettings["cors_allowHeaders"];
     8         var allowMethods = ConfigurationManager.AppSettings["cors_allowMethods"];
     9         var globalCors = new EnableCorsAttribute(allowOrigins, allowHeaders, allowMethods){
    10             SupportsCredentials = true
    11         };
    12         config.EnableCors(globalCors);
    13         // Web API 路由
    14         config.MapHttpAttributeRoutes();
    15         config.Routes.MapHttpRoute(
    16             name: "DefaultApi",
    17             routeTemplate: "api/{controller}/{id}",
    18             defaults: new { id = RouteParameter.Optional }
    19         );
    20     }
    21 }
    • 第四种:如何只是对某一些API进行跨域,可以直接在这些API的控制器上进行设置
     1 //还需要WebApiConfig文件中的Register方法启用config.EnableCors()
     2 [EnableCors(origins: "http://127.0.0.1:5501", headers: "*", methods: "GET,POST,PUT,DELETE")]
     3 //http://127.0.0.1:5501代表了请求的资源地址
     4 public class Ch04Controller : ApiController
     5 {
     6     [HttpGet]
     7     public string GetAllChargingData(){
     8         return "Success";
     9     }
    10 }
  • 相关阅读:
    drf请求生命周期
    正向代理和反向代理
    cbv源码分析
    Python搭建调用本地dll的Windows服务(浏览器可以访问,附测试dll64位和32位文件)
    Python实现聊天机器人接口封装部署
    Python实现机器人语音聊天
    Python爬虫下载美女图片(不同网站不同方法)
    微信小程序-点餐系统
    Win10系统Python3.8的升级与安装
    Python破解Wifi密码思路
  • 原文地址:https://www.cnblogs.com/My-Sun-Shine/p/13509665.html
Copyright © 2011-2022 走看看