在通常情况下,出现跨域问题是因为浏览器的同源策略(Same-Origin Policy)限制了从一个源(origin)发起的 HTTP 请求到另一个不同源的地址。为了解决这个问题,你可以使用 whistle 来设置代理和跨域资源共享(CORS)规则。

whistle官方文档

关于whistle · GitBook (wproxy.org)

以下是如何配置 whistle 来解决跨域问题:

  1. 安装和启动 whistle

    首先确保你已经安装了 Node.js 和 whistle,如果没有,可以通过以下命令安装 whistle:

    1
    npm install -g whistle

    然后启动 whistle:

    1
    w2 start
  2. 配置 whistle

    创建一个 whistle 的规则文件,比如 whistle.rules,用于定义代理和跨域资源共享(CORS)规则。在这个文件中添加以下内容:

    1
    2
    3
    4
    5
    6
    # 设置代理
    https://api.juejin.cn/booklet_api/v1/booklet/listbycategory?aid=2608&uuid=7384269412516578816&spider=0 127.0.0.1:8000

    # 设置跨域资源共享(CORS)
    /booklet_api/v1/booklet/listbycategory?aid=2608&uuid=7384269412516578816&spider=0
    enableCors('https://juejin.cn', 'GET,POST', 'accept,accept-language,content-type,priority,sec-ch-ua,sec-ch-ua-mobile,sec-ch-ua-platform,x-secsdk-csrf-token', 'true')
    • 第一行配置了将 https://api.juejin.cn/booklet_api/v1/booklet/listbycategory?aid=2608&uuid=7384269412516578816&spider=0 的请求代理到本地的 127.0.0.1:8000 端口。
    • 第二行配置了跨域资源共享(CORS),允许来自 https://juejin.cn 的请求使用 GETPOST 方法,允许的请求头包括 accept,accept-language,content-type,priority,sec-ch-ua,sec-ch-ua-mobile,sec-ch-ua-platform,x-secsdk-csrf-token,并设置 Access-Control-Allow-Origintrue
  3. 启用规则文件

    whistle.rules 文件放置在 whistle 的配置目录下,通常是 ~/.WhistleAppData/rules/,然后重新启动 whistle 或使用命令 w2 restart 来加载新的规则文件。

  4. 测试

    现在重新加载页面或重新发送请求,应该能够成功访问 https://api.juejin.cn/booklet_api/v1/booklet/listbycategory 并解决跨域问题。

通过这种方式,你可以利用 whistle 的代理和规则功能来解决浏览器中出现的跨域请求问题,同时还能灵活地控制请求和响应的流量。

如果你的本地开发服务器运行在 http://127.0.0.1:5500,而你想通过 whistle 来代理这个本地服务器上的页面和请求,可以按照以下步骤进行配置:

  1. 安装和启动 whistle

    确保你已经安装了 Node.js 和 whistle。如果没有,可以通过以下命令安装 whistle:

    1
    npm install -g whistle

    然后启动 whistle:

    1
    w2 start
  2. 配置 whistle

    创建一个 whistle 的规则文件,比如 whistle.rules,用于定义代理和跨域资源共享(CORS)规则。在这个文件中添加以下内容:

    1
    2
    3
    4
    5
    6
    # 设置代理
    http://127.0.0.1:5500/ 127.0.0.1:8000

    # 设置跨域资源共享(CORS)
    /example/
    enableCors('http://127.0.0.1:5500', 'GET,POST', '*', 'true')
    • 第一行配置了将以 http://127.0.0.1:5500/ 开头的请求代理到本地的 127.0.0.1:8000 端口。这里假设你的本地开发服务器运行在 http://127.0.0.1:5500
    • 第二行配置了跨域资源共享(CORS),允许来自 http://127.0.0.1:5500 的任何请求使用 GETPOST 方法,并允许所有的请求头,同时设置 Access-Control-Allow-Origintrue
  3. 启用规则文件

    whistle.rules 文件放置在 whistle 的配置目录下,通常是 ~/.WhistleAppData/rules/,然后重新启动 whistle 或使用命令 w2 restart 来加载新的规则文件。

  4. 测试

    确保你的本地开发服务器正在运行,并且通过 whistle 配置的代理和 CORS 规则来访问页面和发起请求。例如,如果你的页面位于 http://127.0.0.1:5500/example/index.html,可以直接在浏览器中访问该页面,或者在页面中包含 JavaScript 请求。

通过这种方式,你可以使用 whistle 代理你本地开发服务器上的页面和请求,并解决跨域问题,从而方便地进行开发和调试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<template>
<div class="catalogs-comp">
<div class="handel">
<el-button round @click="toCreate">新建文件夹</el-button>
</div>
<div class="catas-list">
<div
v-for="item in store.catalogs"
:key="item.cata_id"
:class="
store.active_cataid == item.cata_id ? 'cata-item active' : 'cata-item'
"
@click="store.setCateId(item.cata_id)"
>
<el-icon :size="17">
<FolderOpened v-if="store.active_cataid == item.cata_id" />
<FolderRemove v-else />
</el-icon>
<span class="text">{{ item.cata_name }}</span>
</div>
</div>
</div>
</template>

<script setup lang="ts">
import { indexStore } from "@/stores";
import { FolderRemove, FolderOpened } from "@element-plus/icons-vue";
import { ElMessageBox } from "element-plus";

const store = indexStore();
const toCreate = () => {
ElMessageBox.prompt("输入文件夹名称", {
confirmButtonText: "确认",
cancelButtonText: "取消",
inputPlaceholder: "不超过10个字",
}).then((res) => {
console.log(res);
if (res.value) {
store.createCata({
user_id: 4204,
cata_name: res.value,
});
}
});
};
</script>

<style lang="less">
.catalogs-comp {
.handel {
// text-align: center;
padding: 10px 16px;
border-bottom: 1px solid #f0f0f0;
}
.catas-list {
padding: 12px 6px;
.cata-item {
padding: 6px 18px;
display: flex;
align-items: center;
.text {
margin-left: 12px;
}
&.active {
color: var(--el-color-primary);
font-weight: bold;
}
&:hover {
cursor: pointer;
background: #f0f0f0;
}
}
}
}
</style>