跨域问题及html引用JavaScript脚本问题

news2025/2/26 6:20:18

        最近在学习 JavaScript,突然想到在上一家公司时跟前端同事调试 web 功能,然后就想着自己手动也搭一个 Http 的服务,这个服务是跑在一个 arm 设备上的,然后呢在局域网内在浏览器通过输入如 192.168.2.100:8000 这样来访问设备,如登录、获取配置、设置配置等等。因为是首次接触前端开发,也不知道怎么开始,然后就是简单地写了一个 html 文件,文件里引用了 js 代码,然后就在本地执行,首先遇到就是跨域问题,如:

 

直接在本地执行是不对的,肯定会出现跨域问题,真是第一次搞这个前端开发,啥也不懂啊,网上搜索了一番,需要从服务器返回一个 html 的文件,然后浏览器解析后再进行操作的。于是把这个index.html 文件拷贝到 arm 上,修改后如下:

 通过ip地址确实可以访问到了arm设备,默认返回的就是 index.html 的内容(这个是默认行为吗?不懂),然而新问题双出现了,如下:

loginbtn 没有定义,这个是一个函数,是我定义在js文件的函数,这个函数绑定到了 “登录” 按钮的 onclick 事件上,我的目的就是点击 “登录” 的时候,向服务器 POST 操作。很明显这里找不到这个函数定义。 以下是 index.html 的内容:

而 login.js 内容却是这样的:

这个内容是我的 http 服务器里应答的内容,奇怪这个怎么会这样?这个服务器程序是基于 mongoose 开源代码开发。一开始以为是 html 里指定的 js 加载路径写错了,网上搜索了好多基本上都是说路径写错导致无法加载到 js 代码,但其实不是,同时搜索到,js 文件是根据在 html 中的位置顺序加载的,也就是说浏览器也会去请求 js 文件,如上 <script src="login.js"></script>,所以浏览器是最后会去请求这个 login.js 文件,而我在 http 服务程序中回复了上面这个内容:

{
   "data" : "test"
}

所以导致 login.js 就成了这个,以至于那个函数没有定义。

 

所以还是服务端程序的问题。最新的 mongoose github 上的代码(版本是 "7.8")已经有例子,但它那个 js 代码对我这个初学者来说太难看懂了,我这个源码还是老版本的(版本是 "6.18")。错误的服务器代码响应是这样的:

浏览器来请求 login.js 的时候,服务器却应答了 “data”:"test" 的内容。我修改了服务端程序,简单到这样:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string>
#include <map>
#include <mutex>
#include "../webServer/mongoose.h"
#include "json/json.h"
#include "../webServer/webServer.h"
#include "comm/log.h"

void eventHandler(struct mg_connection *nc, int event, void *eventData);
void handleRequest(struct mg_connection *connection, int32_t event, void *data);
void* addConnection(struct mg_connection *nc);
void delConnection(void *usrData);

const char *sgWorkPath = "/web";

struct userData
{
    int index;
};

struct FileInfo
{
    FILE *fp;
    char fileName[32];
    char filePath[32];
    size_t size;
};

std::map<std::string, std::string> g_headerMap;
std::map<int, void *> g_connectionMap; //连接映射表,当多线程时,用于找到对应连接进行应答
std::string g_protocol; //协议,如http /1.1
std::string g_stateStr; //状态描述,用于返回应答

int g_status = 200;  //应答状态
int g_connectId = 0; //连接id的分配

std::mutex g_mutex;

//用postman 测试,linux需要关闭防火墙,否则收不到数据
int main(int argc, char *argv[])
{   
    if(argc < 2)
    {
        errorf("Usage: %s port\n", argv[0]);
        return 1;
    }

    int port = atoi(argv[1]);

    struct userData uData{100};
    struct mg_mgr mgr;

    //mgr里的user_data指针将会指向第二个参数,当有连接过来时
    //mg_connection中的mgr中的user_data指向的就是第二个参数
    mg_mgr_init(&mgr, &uData);

    char buf[32] = {0};
    snprintf(buf, sizeof(buf), "%d", port);
    struct mg_connection *con = mg_bind(&mgr, buf, eventHandler);

    if(con == NULL) {
        errorf("mg_bind fail\n");
        return -1;
    }

    mg_set_protocol_http_websocket(con);

    uData.index = 200;
    infof("listen ip[%s], port[%d]....\n", inet_ntoa(con->sa.sin.sin_addr), port);

    while (1)
    {
        mg_mgr_poll(&mgr, 100);
    }
    
    mg_mgr_free(&mgr);
    return 0;
}

void eventHandler(struct mg_connection *nc, int event, void *eventData)
{
    switch (event)
    {
        case MG_EV_ACCEPT:
            // tracef("a new accept!!\n");
            // nc->user_data = addConnection(nc); //delConnection时用uc进行connctionID的传递
            break;
        case MG_EV_HTTP_REQUEST:
            // tracef("a new http request!!\n");      
            handleRequest(nc, event, eventData);
            break;
        case MG_EV_CLOSE:
            // tracef("request close!!\n");
            delConnection(nc->user_data);
            nc->user_data = nullptr;
            break;
        default:
            break;
    }
}

// 添加一个连接
void* addConnection(struct mg_connection *nc)
{
    userData *data = new userData; //此内存在delConnection时进行释放
    std::lock_guard<std::mutex> lockGuard(g_mutex);
    g_connectId += 1;
    data->index = g_connectId;
    g_connectionMap.insert(std::pair<int, void*>(g_connectId, nc));

    return data;
}

// 删除一个连接
void delConnection(void *usrData)
{
    userData *data = (userData*)usrData;
    if(data == NULL)
    {
        return;
    }

    if(g_connectionMap.find(data->index) != g_connectionMap.end())
    {
        tracef("delete connection id: %d\n", data->index);
        g_connectionMap.erase(data->index);
    }
    delete data; //释放addConnection时申请的内存
}

void setServerPath(struct mg_connection *connection, struct http_message* msg, const char *path)
{
    warnf("set server path: %s\n", path);
    struct mg_serve_http_opts opts;
    memset(&opts, 0, sizeof(opts));
    opts.enable_directory_listing = "yes";
    opts.document_root = path;
    mg_serve_http(connection, msg, opts);
}

void handleRequest(struct mg_connection *connection, int32_t event, void *data)
{
    struct http_message* msg = (struct http_message*)data;

    //请求正文
    std::string body(msg->body.p, msg->body.len);
    if(body.length() > 0)
    {
        tracef("body size: %u, %s\n", body.length(), body.c_str());
    }

    //请求的地址,不包括ip地址和端口号
    std::string uri(msg->uri.p, msg->uri.len);

    //请求的方法,GET、POST、PUT等
    std::string method(msg->method.p, msg->method.len);
    tracef("connect from ip: %s, method = %s, uri = %s\n", inet_ntoa(connection->sa.sin.sin_addr), method.c_str(), uri.c_str());    

    //设置资源根目录
    if(uri == "/api/user/login/")
    {

    }
    else 
    {
        setServerPath(connection, msg, sgWorkPath);
        return;
    }
}

最后 login.js 加载成功了

 

这样才能接着往下添加新的功能了。 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web(十一)JavaScript知识训练-日期对象

1、 下列关于JavaScript中Date日期对象的描述正确的是&#xff08; C&#xff09; A、 getMonth()返回Date对象的月份&#xff0c;其值介于1-12之间 B、 getDate()返回Date对象的一个月中的每一天&#xff0c;其值介于1-31之间 C、 getHours()返回Date对象的小时数&#xff0c;…

为什么要来长沙投资?我从长沙招商新政策中找到了答案!

凭借着一系列好吃的、好玩的、好看的产品&#xff0c;长沙已经顺利成为全国热门旅游目的地&#xff0c;成为全世界都小有名气的旅游城市。 作为一名在长沙创业的长沙人&#xff0c;笔者此前经常会向北上广深的朋友们推荐长沙好吃的、好玩的&#xff0c;也会向湘籍科技互联网人…

【软件测试】测试人:明明项目已经通过了各种的测试,交付还会出现问题?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 为什么软件明明通过…

【前端开发学习】3.BootStrap

文章目录1 BootStrap2 栅格系统3 container4 面板5 案例&#xff1a;用户登录1.阴影2. 登录按钮3. 居中4. 表单项6 案例&#xff1a;后台管理7 图标8 BootStrap 依赖1 BootStrap 别人写好的 CSS 样式&#xff0c;如果想要这个 BootStrap&#xff1a; 下载 BootStrap&#xff…

Jupyter Notebook 如何安装 + 使用?【审核5次重磅发布】

人生苦短 我用python 给大家介绍一下关于Jupyter Notebook的用法 关于它的组成部分就先不在这里详细解说啦~ 毕竟我可太懂你们啦~ 文章太长就会吃灰的~ 一、什么是Jupyter Notebook&#xff1f; 1. 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序。 其可被应用于…

数据结构——插入排序和希尔排序

坚持看完&#xff0c;结尾有思维导图总结 这里写目录标题插入排序插入排序的步骤什么是插入排序插入排序的单趟排序单趟排序的步骤插入排序的图解完整的插入排序排序插入排序的程序插入排序的常见问题关于插入排序的时间复杂度分析希尔排序希尔排序的图解希尔排序的步骤希尔排序…

微服务框架 SpringCloud微服务架构 多级缓存 47 Lua 语法入门 47.3 条件控制、函数

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存47 Lua 语法入门47.3 条件控制、函数47.3.1 函数47.3.2 条件控制47 Lua 语法入门 47.3 条件控制、函数…

流水线Flow【可持续集成自动化部署】解决方案

文章目录前言一、准备项目代码1.默认的项目2.浏览器访问二、使用步骤1.进入工作台2.创建流水线3.代码源4.代码扫描5.单元测试6.代码构建7.主机部署8.部署脚本三、运行测试1.运行流水线2.测试报告3.访问项目总结前言 「流水线」&#xff0c;又名「Flow」&#xff0c;是一款企业…

Java+MySQL基于SSM的学生宿舍管理系统的设计与实现 开题 论文

随着我国教育制度的改革,各大高校一直在不断的扩招相对应的学生的数量也在不断的增加。在学生数量增加之后学校后勤人员就需要对后勤部分更加精准的进行管理,其中宿舍管理就是后勤管理中比较重要的一个组成部分。如何能够对学生的宿舍信息进行更加科学合理的管理是当前大多数高…

单张图像三维人脸重建必备入门face3d--pipeline

作者&#xff1a;小灰灰 来源&#xff1a;投稿 编辑&#xff1a;学姐 上期传送门&#x1f449;单张图像三维人脸重建必备入门face3d—3DMM 三维人脸的必备入门就要看Yao Feng写的https://github.com/YadiraF/face3d 这个代码主要介绍了3D人脸的一些功能&#xff0c;处理网格数…

Python -- 函数

目录 函数的介绍 1.函数定义和调用 2.函数的参数 2.1 定义、调用带有参数的函数 2.2 调用函数时参数的顺序 3.函数的返回值 3.1 返回值介绍&#xff1a; 3.2 带有返回值的函数 3.3 保存函数的返回值 4.文档注释 4.1 基本使用 4.2 高级使用 5.函数调用函数 6.函数高…

基于java的拼图游戏的设计与实现-计算机毕业设计

项目介绍 java版拼图游戏的功能有开始游戏&#xff0c;背景图片(可自己选择添加图片)&#xff0c;难度选择&#xff08;9格的初级&#xff0c;16格中级和以及25格的高级&#xff09;&#xff0c;成绩统计&#xff0c;分数排名等功能。游戏界面具有外观简洁美丽&#xff0c;操作…

Django学习Day4

1.静态文件 静态文件一般是指网页中的图片、js、css、音视频文件。是指不会随着用户的请求动态变更的文件信息和互联网资源。 关于静态文件的配置&#xff0c;需要在settings.py中进行指定。 &#xff08;1&#xff09;配置静态文件的访问路径。 &#xff08;2&#xff09;ST…

【NodeJs学习笔记】WebPack介绍

什么是WebPack WebPack主要用于模块打包。 它做的事情是&#xff0c;分析项目结构&#xff0c;找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言&#xff08;Scss&#xff0c;TypeScript等&#xff09;&#xff0c;并将其打包为合适的格式以供浏览器使用。 官…

如何使用 Git 操控Gitee远程库?如何进行 团队内协作 与 跨团队协作 ?这一篇就够了~

目录 前言 一、创建别名 二、推送本地库到远程库 三、拉取远程库代码到本地库 四、 克隆远程库到本地 五、团队内协作 六、跨团队协作 前言 如何通过Git操作Gitee/GitHub远程库&#xff1f;在Gitee/GitHub上如何进行 团队协作 与 跨团队协作&#xff0c;看完本篇&#x…

关于游戏介绍的HTML网页设计 HTML5期末考核大作业 HTML静态游戏网页作业 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

LeetCode 热题 C++ 98. 验证二叉搜索树 101. 对称二叉树

力扣98 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1&#xff1a…

记一次 .NET 某工控MES程序 崩溃分析

一&#xff1a;背景 1.讲故事 前几天有位朋友找到我&#xff0c;说他的程序出现了偶发性崩溃&#xff0c;已经抓到了dump文件&#xff0c;Windows事件日志显示的崩溃点在 clr.dll 中&#xff0c;让我帮忙看下是怎么回事&#xff0c;那到底怎么回事呢? 上 WinDbg 说话。 二&…

Linux文件权限概念

目录 前言 1、Linux 文件属性 1.1、档案类型权限 1.2、连结数 1.3、档案拥有者 1.4、档案所属群组 1.5、档案容量 1.6、档案最后被修改的时间 1.7、档名&#xff08;文件名&#xff09; 2、如何改变文件属性和权限 2.1、改变所属群组, chgrp 2.2、改变档案拥有者, c…

Codeforces Round #838 (Div. 2) E. Tree Sum(组合数学 prufer序列 枚举边算贡献)

题目 n(n<5e5)个点的树&#xff0c;边只能选-1或1&#xff0c; 若对于每个点i来说&#xff0c;i相连的所有边的乘积值为-1&#xff0c;则称这棵树是「good tree」 根据Cayley公式&#xff0c;有种树形&#xff0c; 对于每一种树形&#xff0c;每条边都有2种选择&#xff…