ESP32-Web-Server编程- 实现 Web 登录网页

ESP32-Web-Server编程- 实现 Web 登录网页

概述

是时候实现更加安全的网页了。登录机制是最简单的控制网页访问权限的方法。

需求及功能解析

本节演示如何在 ESP32 上部署一个 Web 服务器,并建立登录页面的机制,用户可以实现登录、登出的功能,控制通过网页访问 ESP32 的内部信息的权限。

目录结构

├── CMakeLists.txt
├── main
│   ├── CMakeLists.txt
│   └── main.c                 User application
├── components
│   └── fs_image
└── README.md                  This is the file you are currently reading
  • 目录结构主要包含主目录 main,以及组件目录 components.
  • 其中组件目录components中包含了用于存储网页文件的 fs_image 目录(即前述前端文件)。

前端代码

登录机制的实现主要是在 JS 文件内。首先在 components/fs_image/web_image/js/index.js 中设置了检查函数,通过检查 是否使能了 login_user,来判断是否跳转到登录界面 login.html.

$(function(){
	if(!sessionStorage.getItem('login_user')){
		window.location = "./login.html";
	}
	$("#logout").click(function(){
		var xhr = new XMLHttpRequest();
        xhr.open("GET", "./logout", true);
        xhr.send();
        setTimeout(function(){ window.open("/logged-out","_self"); }, 1000);
	})
})

然后在 components/fs_image/web_image/login.html 中设计登录界面,登录界面包含登录需要的 logemail、password 输入框,和登录提交 submit 按钮。

<div class="form-group">
    <input type="email" name="logemail" class="form-style" placeholder="账号" id="loginuser" autocomplete="off">
    <i class="input-icon uil uil-at"></i>
</div>	
<div class="form-group mt-2">
    <input type="password" name="logpass" class="form-style" placeholder="密码" id="loginpwd" autocomplete="off">
    <i class="input-icon uil uil-lock-alt"></i>
</div>
<a href="#" id="submit" class="btn mt-4">提交</a>

在点击提交时,会触发 components/fs_image/web_image/js/login.js 中的提交帐号、密码的函数 submit().

后端代码

后端代码主要是增加了校验前端网页提交的帐号、密码的函数 login_post_handler()

{"/loginpwd", HTTP_POST, login_post_handler, rest_context},

在该函数中,接收推动数据,并解析推送数据中的帐号、密码:

static esp_err_t login_post_handler(httpd_req_t* req)
{
    char user[USER_NAME_MAX_LEN];
    char password[PASSWORD_MAX_LEN];
    char* buf = ((rest_server_context_t*) (req->user_ctx))->scratch;
    int str_len = 0;
    if (recv_post_data(req, buf) != ESP_OK) {
        web_response_error(req, HTTPD_500);
        ESP_LOGE(TAG, "recv post data error");
        goto error_handle;
        return ESP_FAIL;
    }

    str_len = httpd_find_arg(buf, "loginuser", (char *)user, sizeof(user), false);
    if ((str_len == -1) || (strlen((char *)user) == 0)) {
        ESP_LOGE(TAG, "user is abnormal");
        goto error_handle;
    } else {
        if (web_str_check(user, web_user_name) != true) {
            ESP_LOGE(TAG, "user_name is wrong");
            goto error_handle;
        }
    }

    str_len = httpd_find_arg(buf, "loginpwd", (char *)password, sizeof(password), false);
    if ((str_len == -1) || (strlen((char *)password) == 0)) {
        ESP_LOGE(TAG, "loginpwd is abnormal");
        goto error_handle;
    } else {
        if (web_str_check(password, web_pwd) != true) {
            ESP_LOGE(TAG, "loginpwd is wrong");
            goto error_handle;
        }
    }
    
    web_response_OK(req);
    return ESP_OK;
error_handle:
    web_response_error(req, HTTPD_400);
    return ESP_FAIL;
}

默认帐号、密码是:

static char web_user_name[USER_NAME_MAX_LEN] = "laowang";
static char web_pwd[PASSWORD_MAX_LEN] = "esp32";

示例效果

在这里插入图片描述
在这里插入图片描述

点击右上脚的“退出”按钮,可以退出该网页:

在这里插入图片描述

讨论

总结

1)本节主要是介绍在 ESP32 Web 上部署登录、登出功能的网页,通过登录机制,可以控制访问 ESP32 Web 的权限。

资源链接

1)ESP32-Web-Server ESP-IDF系列博客介绍
2)对应示例的 code 链接 (点击直达代码仓库)

3)下一篇:

(码字不易感谢点赞或收藏)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python表白限定】李峋同款可写字版跳动的爱心(完整代码)

文章目录 跳动的爱心环境需求完整代码详细分析系列文章 跳动的爱心 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0&#xff08;可选&#xff0c;这个库用于打包&#xff0c;使程序没有python环境也可以运行&#xff0c;如果想发给好朋友的话需要这…

nginx配置反向代理及负载均衡

目录 1.前端发送的请求&#xff0c;是如何请求到后端服务的1.nginx 反向代理的好处&#xff1a;2.nginx 反向代理的配置方式&#xff1a;3. nginx 负载均衡的配置方式 1.前端发送的请求&#xff0c;是如何请求到后端服务的 1.nginx 反向代理的好处&#xff1a; 提高访问速度 因…

一文解决msxml3.dll文件缺失问题,快速修复msxml3.dll

在了解问题之前&#xff0c;我们必须首先清楚msxml3.dll到底是什么。DLL&#xff08;Dynamic Link Libraries&#xff09;文件是Windows操作系统使用的一个重要组成部分&#xff0c;用于存储执行特定操作或任务的代码和数据。msxml3.dll为Windows系统提供处理XML文档的功能。如…

小米摄像头拆机教程

今天拆解一下好久不用的小米摄像头&#xff0c;记录下拆机过程&#xff0c;有需要的小伙伴可以自行查看 一、拆底座 首先拿出底座的四个橡皮塞、把对应的螺丝拧下来就可以了&#xff0c;这一步还是比较简单的 二、拆下底部排线 三、拆下底部电机和底座 按下方的红圈拆掉电机上的…

全网最新最全的Jmeter接口测试:jmeter组件元件介绍

JMeter 的主要测试组件总结如下&#xff1a; 1. 测试计划是使用 JMeter 进行测试的起点&#xff0c;它是其它 JMeter 测试元件的容器 2. 线程组代表一定数量的并发用户&#xff0c;它可以用来模拟并发用户发送请求。实际的 请求内容在Sampler中定义&#xff0c;它被线程组包含…

Redis主从复制实现RCE

文章目录 前置知识概念redis module 利用条件利用工具思路例题 [网鼎杯 2020 玄武组]SSRFMe 前置知识 概念 背景是多台服务器要保存同一份数据&#xff0c;如何实现其一致性呢&#xff1f;数据的读写操作是否每台服务器都可以处理&#xff1f;这里Redis就提供了主从复制的模式…

c++ pcl出现LNK2019 宏定义 PCL_NO_PRECOMPILE

问题&#xff1a;c pcl使用拟合圆柱时出现LNK2019问题&#xff1b; 说明&#xff1a;lib等配置没有问题&#xff1b; 解决方案 在上述代码中添加如下代码即可 #define PCL_NO_PRECOMPILE 是 C 中的预处理器指令&#xff0c;用于在代码中定义一个宏。而 #undef PCL_NO_PRECOM…

汽车行驶不同工况数据

1、内容简介 略 28-可以交流、咨询、答疑 2、内容说明 汽车行驶不同工况数据 汽车行驶不同工况数据 ECE、EUDC、FTP75、NEDC、自定义 3、仿真分析 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1AAJ_SlHseYpa5HAwMJlk1w 提取码&#xff1a;rvol

Unittest自动化测试之unittestunittest_生成测试报告

unittest_生成测试报告 测试报告为测试结果的统计即展示&#xff0c;是自动化测试不可或缺的一部分&#xff0c;利用unittest 可以生成测试报告 方式一、使用第三方 HTMLTestRunner 执行测试用例集&#xff0c;生成网页版测试报告&#xff08;推荐&#xff09; HTMLTestRunn…

进程与线程的区别

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构,mysql,javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 进程与线程的区别 进程线程进程与线…

Java流处理之序列化和打印流

文章目录 序列化概述ObjectOutputStream类构造方法序列化操作 ObjectInputStream类构造方法反序列化操作1**反序列化操作2** 案例&#xff1a;序列化集合案例分析案例实现 打印流概述PrintStream类构造方法改变打印流向 序列化 概述 Java 提供了一种对象序列化的机制。用一个…

回顾Django的第二天

1.http 1.1http请求协议与响应协议 1.1.1简介 http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的请求协议。用于HTTP协议交互的信被为HTTP报文。请求端(客户端)的HTTP报文 做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身…

Linux5-计划任务、进程

计划任务 一、cron 计划任务 周期性计划任务 cron 任务概述 • 用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务 • 软件包&#xff1a;cronie、crontabs • 系统服务&#xff1a;crond • 日志文件&#xff1a;/var/log/crond 管理计划任务策略 • 使用 cro…

threejs教程

应群友要求出了个小白教程&#xff0c;此外也有进阶教程。 替代之前老版本的教程。 教程案例&#xff1a; 新教程地址&#xff1a;https://www.wellyyss.cn/ys-course/#/ 教程使用的是react搭建的 高级教程主要是案例 年底比较忙估计要晚一点才整合。 后续的计划是&#xff1…

三、Linux高级命令

目录 1、重定向命令 1.1 重定向 > 1.2 重定向 >> 该章节的所有操作都在/export/data/shell目录进行&#xff0c;请提前创建该目录。 mkdir -p /export/data/ 1、重定向命令 1.1 重定向 > Linux 允许将命令执行结果重定向到一个文件&#xff0c;本应显示在…

Ubuntu18.04 Udacity project_9_PID_control 如何运行

工程源码和仿真器下载&#xff1a; 源码 仿真器 --- Ubuntu就下载 term2_sim_linux.zip 这个压缩文件即可 紧接着给方框中的文件赋可执行权限 打开project_9_PID_control文件夹 执行如下脚本&#xff0c;安装必要的库&#xff0c;比如websocket&#xff08;程序生成的可执行…

nagios 监控dell设备(网上相关内容较少,特意留档)

#创作灵感#记录工作实践、项目复盘 错误信息&#xff1a; a.Unable to get status information due to technical issues. b.Dell EMC device discovery is in progress... Error: Empty or Invalid Passphrase is configured c.Error: Path not configured for the macro …

C++模板—函数模板、类模板

目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值&#xff0c;针对不同类型&#xff0c;我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…

传统算法: Pygame 实现快速排序

使用 Pygame 模块实现了快速排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过快速排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序选择一个基准元素(pivot),将数组分成两部分,…

C语言每日一题(43)旋转链表

力扣 61 旋转链表 题目描述 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], …