• .net core api 跨域


    什么是跨域?

    跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。

    所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子:

    http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域)

    http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)

    http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)

    http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)

    http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)

    请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。

    浏览器执行javascript脚本时,会检查这个脚本属于哪个页面,如果不是同源页面,就不会被执行。

    你可以理解为两个域名之间不能跨过域名来发送请求或者请求数据,否则就是不安全的,这种不安全也就是CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

    一张图解释什么是CSRF

    跨域解决方案

    可以参考这篇文章:

    https://www.cnblogs.com/wennice/p/7150461.html

    由于我后端用的是.net core api (.net core 2.2)在开发,开发中遇到的坑,记录一下

    最开始设置允许跨域,按网上的方法

    在Startup 下 ConfigureServices 添加如下代码,就是设置允许任何请求方法和网站跨域访问

    // 添加跨域访问
                services.AddCors(options =>
                options.AddPolicy("AllowAnyOrigin",
                    builder => builder.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));

    在Configure 方法 使用刚刚的配置项:

    app.UseCors("AllowAnyOrigin");

    发现控制器不抛异常,可以跨域访问,抛了异常 进入全局异常中间件里面 ExceptionMiddleWare.cs

    private static async Task WriteExceptionAsync(HttpContext context, Exception exception)
            {
                //返回友好的提示
                var response = context.Response;
    
                //状态码
    
                response.StatusCode = (int)HttpStatusCode.OK;
                response.ContentType = context.Request.Headers["Accept"];
                response.ContentType = "application/json";
                ApiResponseInfo apiResponse = new ApiResponseInfo();
                if (exception is ApiBaseException)
                {
                    //用户定义异常
                    apiResponse.StatusCode = (exception as ApiBaseException).StatusCode;
                    apiResponse.MessageText = (exception as ApiBaseException).MessageText;
                }
                else
                {
                    apiResponse.StatusCode = "100000";
                    apiResponse.MessageText = StatusCodesConfig.GetRemark(apiResponse.StatusCode);
                    Log.LoggerUnit.Logger.WriteError("未知异常:", exception);
                }
                await response.WriteAsync(JsonConvert.SerializeObject(apiResponse)).ConfigureAwait(false);
    
            }
    app.UseCors("AllowAnyOrigin"); 配置没有生效,跨域的功能没有了,前端ajax post 请求一直提示跨域问题报

    Access to XMLHttpRequest at 'https://localhost:44357/api/**/GetPaging' from 
    origin 'http://127.0.0.1:5500' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No
    'Access-Control-Allow-Origin' header is present on the requested resource.

    最后发现是之前设置了HTTP重定向app.UseHttpsRedirection();
    没有生效 需要设置HTTPS 的跨域功能,代码如下:
    app.UseHttpsRedirection().UseCors(builder =>
           builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); 
    //或者
    app.UseHttpsRedirection().UseCors("AllowAnyOrigin"); 

      

    之后jquery.ajax 就可以访问了。


    参考

    https://www.cnblogs.com/wennice/p/7150461.html

  • 相关阅读:
    eclipse 设置默认编码为Utf-8
    重新打开Eclipse出现“An internal error has occurred. java.lang.NullPointerException”
    Eclipse启动时出现错误 An internal error occurred during: "Updating indexes"
    eclipse卸载自带maven
    JAVA实现SFTP实例
    springboot-24-restTemplate的使用
    Jmeter在restful风格接口测试中的应用
    Swagger介绍-一套流行的API框架
    SQL 里ESCAPE的用法
    CALL 'SYSTEM' ID 'COMMAND'
  • 原文地址:https://www.cnblogs.com/piaoxuewuming/p/10496053.html
Copyright © 2020-2023  润新知