Nancy + jQuery通过CORS实现跨域调用

最近今天研究了下用Nancy实现跨域的调用,后端如何实现很快就查到了,前端的版本很多,各种方法都试了一遍还是不行,最后才查到可能是浏览器设置的缘故,为此还下载了Chrome浏览器并新建了一个用于调试跨域的快捷方式,还复习了下CORS的原理。

1、服务端

参考:Nancy支持跨域请求CORS_nancy跨域-CSDN博客

public class MyModule : NancyModule
{
    public MyModule()
    {
        After.AddItemToEndOfPipeline((ctx) => ctx.Response
            .WithHeader("Access-Control-Allow-Origin", "*")
            .WithHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS")
            .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type"));
    }
}

public class MyNancyBootstrapper : DefaultNancyBootstrapper
 {
        /// <summary>
        /// nancy配置
        /// </summary>
        /// <param name="container">容器</param>
        /// <param name="pipelines">管道</param>
        protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
        {
                pipelines.AfterRequest.AddItemToEndOfPipeline((ctx) =>
                {
                    ctx.Response.WithHeader("Access-Control-Allow-Origin", "*")
                        .WithHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS")
                        .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type");
                });
        }
}

2、客户端

工具:jQuery

参考:https://www.cnblogs.com/daweiguo/p/14308041.html

            $.ajax({
                type: "GET",
                url: "http://localhost:4024/",
                data: {},
                headers: {
                    "Access-Control-Allow-Origin": "*",
                    'Content-Type': 'text/plain',
                },
                success: function (msg) {
                    alert("Data Saved: " + msg);
                }
            });

ps:使用上面的方法后,发现有问题,无法在不开启浏览器跨域的情况下实现跨域,之后换了一种方法,没用到jQuery而是使用js的XMLHttpRequest对象。参考的是:https://www.cnblogs.com/cjw-ryh/p/7674038.html

这里面的例子是Get方法的,如果需要改成Post,可以参考《JavaScript高级程序设计(第四版)》的第24章,网络请求与远程资源。

3、浏览器设置

参考:Chrome浏览器的跨域设置----包含新老版本两种设置_谷歌浏览器跨域设置-CSDN博客

一开始没搞懂为什么要指定一个不存在的路径,就没用它。。

之后我发现,只要开起来浏览器跨域,后端不用做修改也能实现跨域。

新版浏览器跨域设置(版本号49之后的跨域设置)

1、在电脑上新建一个目录(任意位置) 例如 C:\MyChromeDevUserData

2、右键点击谷歌浏览器,选择属性;

3、在目标输入框尾部加上 --disable-web-security --user-data-dir=C:\MyChromeDevUserData

注意:

1、两个 -- 前面都是有空格的哦~

2、如果目标地址原先有引号,那么 --disable-web-security --user-data-dir=C:\MyChromeDevUserData 要加在引号外面。

4、扩展

参考:跨域资源共享 CORS 详解 - 阮一峰的网络日志

这篇文章详细介绍了CORS

要使用Java和JavaScript中的AJAX和CORS实现跨域请求,可以按照以下步骤进行设置: 在Java后端: 1. 在处理跨域请求的Java代码中,添加以下响应头,以启用CORS: ```java response.setHeader("Access-Control-Allow-Origin", "http://example.com"); // 允许特定的源访问 response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); // 允许的HTTP方法 response.setHeader("Access-Control-Allow-Headers", "Content-Type"); // 允许的请求头 response.setHeader("Access-Control-Allow-Credentials", "true"); // 是否允许发送Cookie response.setHeader("Access-Control-Max-Age", "3600"); // 预检请求的有效期 ``` 2. 在处理OPTIONS请求的方法中添加以下响应头,以处理预检请求(preflight request): ```java response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); response.setHeader("Access-Control-Allow-Headers", "Content-Type"); response.setHeader("Access-Control-Max-Age", "3600"); response.setStatus(HttpServletResponse.SC_OK); ``` 在JavaScript前端: 3. 使用XMLHttpRequest或fetch API发送跨域请求,并在请求头中添加Origin字段: ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://api.example.com/data', true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.setRequestHeader('Origin', 'http://example.com'); xhr.withCredentials = true; // 允许发送Cookie xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var response = JSON.parse(xhr.responseText); // 处理响应 } }; xhr.send(); ``` 这样,Java后端设置了CORS支持,允许特定源访问资源,并在JavaScript前端发送跨域请求时设置了请求头,指示该请求是一个跨域请求。同时,设置了withCredentials属性为true,以允许发送Cookie。 请注意,实际应用中需要根据需求和安全考虑进行适当的配置和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值