node 第八天 使用前后端不分离的方式实现cookie登录验证
- 实现cookie登录, 第一次登录成功后, cookie由服务端设置并保存在客户端, 后续访问在cookie过期前 (过期时间由后端设置) 将不需要登录
- cookie出现的背景是
HTTP是无连接的,无状态的, 半双工(http2.0以下), 所以需要一个媒介存在http中, 服务端可以操作, 客户端也可以操作
就出现了cookie - 纯后端实现cookie登录验证功能
- node 后端
const fs = require('fs');
const url = require('url');
const http = require('http');
const querystring = require('querystring');
const path = require('path');const server = http.createServer((req, res) => {let cookie = req.headers.cookie;cookie = cookie.replace(/\s/g, '');const cookieInfo = querystring.parse(cookie, ';');console.log(cookie, cookieInfo);res.writeHead(200, { 'content-type': 'text/html' });if (req.method.toUpperCase() === 'GET') {if (cookieInfo.token === 'abc') {fs.readFile('./content.html', (err, data) => {if (err) {throw err;}res.end(data, 'utf-8');});} else {fs.readFile('./login.html', (err, data) => {if (err) {throw err;}res.end(data, 'utf-8');});}} else {req.on('data', chunk => {let data = querystring.parse(chunk.toString('utf-8'));if (data.user === 'zhang' && data.pw === '123') {let date = new Date();date.setDate(date.getDate() + 1);let expires = date.toUTCString();res.writeHead(200, {'content-type': 'text/html','set-cookie': [`token=abc; Expires=${expires}; HttpOnly;`, 'koken2=123']});fs.readFile('./content.html', (err, data) => {if (err) {throw err;}res.end(data, 'utf-8');});} else {fs.readFile('./login.html', (err, data) => {if (err) {throw err;}res.end(data, 'utf-8');});}});}
});
server.listen(3006);
- 未登录则返回登录页面
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>登录页</title></head><body><h1>请登录:</h1><form action="http://127.0.0.1:3006/login" method="post" enctype="application/x-www-form-urlencoded"><input name="user" type="text" /><input name="pw" type="password" /><input type="submit" value="登录" /></form></body>
</html>
- 已登录或有cookie凭证则返回内容页
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>内容页</title></head><body><h1>欢迎您~</h1></body>
</html>
- 实现比较简单, 仅是基础流程演示
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
node 第八天 使用前后端不分离的方式实现cookie登录验证
实现cookie登录, 第一次登录成功后, cookie由服务端设置并保存在客户端, 后续访问在cookie过期前 (过期时间由后端设置) 将不需要登录cookie出现的背景是 HTTP是无连接的,无状态的, 半双工(http2.0以下), 所以需要一个媒介存在http中, 服务端可以操作, 客户端也可以…...
![](https://img-blog.csdnimg.cn/019b90f9b4a64a4fadd0f5f09a7ce86b.png)
Ubuntu系统如何进行网络连接-连接电脑局域网-物联网开发-Ubuntu系统维护
一、前言 在Ubuntu系统的维护中,我们常常需要对VMware中的Ubuntu虚拟机配置网络连接,以连接服务器下载或安装软件包以及进行网络通信等。 基于上述问题,本文将着重分享Ubuntu配置网络链接的若干方法。 二、网络连接模式 打开VM,右…...
![](https://img-blog.csdnimg.cn/84e4f302e57d484db21cb6e391517ed1.png)
STL库——Vector常见使用接口
一、介绍 1. vector是表示可变大小数组的序列容器,就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
将文件(File 对象)分割成多个块
如果要将文件(File 对象)分割成多个块,可以使用 JavaScript 中的 Blob 和 File 构造函数以及数组的 slice 方法。以下是一个示例: // 创建一个 File 对象,例如从文件输入框获取的文件 const file document.getElemen…...
![](https://img-blog.csdnimg.cn/a6bce12ee70440c0b7344fcb7881e11e.png)
若要对多态类进行深拷贝,应使用虚函数的clone,而不是公开的拷贝构造赋值
拷贝一个多态类可能会导致切片问题,为了解决这个问题,应覆盖一个虚clone函数,让他根据实际类型进行复制并返回一个到新对象的所有权的指针(std::unique_ptr),在派生类,通过使用所谓的协变返回类型来返回派生…...
![](https://www.ngui.cc/images/no-images.jpg)
同构字符串(C++解法)
题目 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上…...
![](https://img-blog.csdnimg.cn/5af251f7c39f4ddf9472e6a0411d9b1b.png)
『Linux升级路』基本指令
🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识操作系统 📒1.1什么是操作系统 📒1.2操作系统…...
![](https://img-blog.csdnimg.cn/fe8d4f67d8c548c7a9f7f162bcb49726.png)
python argparse解析参数
用法比较简单,直接看代码 import argparseargparser argparse.ArgumentParser(descriptionthis is a hello argparser program) argparser.add_argument(--arg1, -a, typestr, helparg1 has value) argparser.add_argument(--arg2, typestr, default"value2&q…...
![](https://img-blog.csdnimg.cn/b235c1f23cb245f9853bed296b5ee79c.png)
【数据挖掘】数据挖掘、关联分析、分类预测、决策树、聚类、类神经网络与罗吉斯回归
目录 一、简介二、关于数据挖掘的经典故事和案例2.1 正在影响中国管理的10大技术2.2 从数字中能够得到什么?2.3 一个网络流传的笑话(转述)2.4 啤酒与尿布2.5 网上书店关联销售的案例2.6 数据挖掘在企业中的应用2.7 交叉销售 三、数据挖掘入门3.1 什么激发了数据挖掘…...
![](https://img-blog.csdnimg.cn/125cce5b939749b5877cda29ff8a576a.bmp)
nodejs+vue 学生宿舍管理系统设计与实现
可将教师信息、宿管信息、学生信息、楼栋信息等输入到系统中。只有管理员才能录入相关的资料,按照提示,输入相应的资料,而“导入”则可以通过上传档案,导入成功后,相应的寝室就会相应的减少。在录入大楼的时候…...
![](https://www.ngui.cc/images/no-images.jpg)
汽车R155法规包含那些国家?
标签:R155法规国; R155强制标准;R155;UCNECE; R155是由联合国欧洲经济委员会(UNECE)的世界汽车行业论坛(WP.29)发布的法规,专门针对汽车的网络安全。因为它是…...
![](https://www.ngui.cc/images/no-images.jpg)
一个简易的低代码
前言 最近接手了一个低代码平台可视化大屏做二次开发,在这里做一些记录。 低代码平台简介:低代码平台是一种开发工具,它可以让开发人员使用简单的拖拽和配置来创建应用程序,而不需要编写大量的代码。低代码平台通常包括一个可视化…...
![](https://img-blog.csdnimg.cn/img_convert/b16a8e688a6b6471bf6f9031d5498d2a.png)
【JVM系列】- 类加载子系统与加载过程
类加载子系统与加载过程 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正…...
![](https://img-blog.csdnimg.cn/img_convert/150016e4fc52de855ed54a8858e29927.png)
Amazon图片下载器:利用Scrapy库完成图像下载任务
概述 本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序,实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架,提供了许多方便的特性,如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理…...
![](https://img-blog.csdnimg.cn/415f52c017a449d180cfed407d4acf95.gif)
Unity中Shader的Pass的复用
文章目录 前言一、怎么实现Pass的复用1、给需要引用的Pass给定特定的名字2、在需要引用 Pass 的Shader中,在Pass的平行位置使用 UsePass "ShaderPath PassName" 二、实现一个没被遮挡的部分显示模型原本的样子,遮挡部分显示模型的XRay效果1、…...
![](https://www.ngui.cc/images/no-images.jpg)
vue内容自适应方法
Vue中可以通过以下几种方式实现内容自适应: 使用CSS媒体查询:使用CSS媒体查询可以根据屏幕大小来动态改变元素的样式。例如,可以设置一个div元素在屏幕宽度小于600px时宽度为100%,在屏幕宽度大于600px时宽度为50%。 使用Vue的计算…...
![](https://www.ngui.cc/images/no-images.jpg)
RustDay05------Exercise[41-50]
41.使用模块的函数 mod 是用于创建模块的关键字。模块是一种组织代码的方式,它可以包含函数 (fn)、结构体 (struct)、枚举 (enum)、常量 (const)、其他模块 (mod) 等。模块用于组织和封装代码,帮助将代码分割成可管理的单元。模块可以形成层次结构&…...
![](https://img-blog.csdnimg.cn/c8150c4fee064fe28ff01cb6aa8ead5d.png)
C语言实现通讯录(超详细)
1.实现怎样一个通讯录 实现一个通讯录联系人信息:1.可以保存100个人的信息名字2.添加联系人年龄3.删除指定联系人性别4.查找指定联系人电话5.修改指定联系人住址6.排序联系人7.显示所有联系人信息 2.通讯录的实现 2.1创建两个源文件和一个头文件 首先我们创建con…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python机器学习】零基础掌握MinCovDet协方差估计
如何更精准地评估资产的风险和收益? 在投资领域,资产的风险和收益评估是至关重要的。传统的协方差矩阵虽然在某种程度上能反映资产间的关联性,但也存在一定的局限性。例如如果样本数量较少,传统的协方差矩阵可能会出现偏差,从而影响投资决策。 假设现在有一个投资组合,…...
![](https://img-blog.csdnimg.cn/img_convert/8f6313da708eba3ae27c80ae541a5431.jpeg)
2023年【四川省安全员A证】模拟试题及四川省安全员A证作业模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 2023年四川省安全员A证模拟试题为正在备考四川省安全员A证操作证的学员准备的理论考试专题,每个月更新的四川省安全员A证作业模拟考试祝您顺利通过四川省安全员A证考试。 1、【多选题】36V照明适用的场所条…...
![](https://www.ngui.cc/images/no-images.jpg)
Flask项目log的集成
一、引入log 在项目的init.py文件中: import logging from logging.handlers import RotatingFileHandlerfrom flask_wtf.csrf import CSRFProtect from flask import Flask from flask_sqlalchemy import SQLAlchemy from redis import StrictRedis from flask_s…...
![](https://img-blog.csdnimg.cn/f9ebe3f23bae41cba81d564a88bdcad6.png#pic_center)
Open3D(C++) 最小二乘拟合平面(拉格朗日乘子法)
目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 设拟合出的平面方程为: a x + b y + c...
![](https://img-blog.csdnimg.cn/096288f6b1544a069336aae6a89efef8.png)
c语言练习93:环形链表的约瑟夫问题
环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是…...
![](https://img-blog.csdnimg.cn/00027bd38c1c4a0ea6b1211026cd5167.png)
从入门到进阶 之 ElasticSearch 文档、分词器 进阶篇
🌹 以上分享 ElasticSearch 文档、分词器 进阶篇,如有问题请指教写。🌹🌹 如你对技术也感兴趣,欢迎交流。🌹🌹🌹 如有需要,请👍点赞💖收藏&#…...
![](https://img-blog.csdnimg.cn/img_convert/a3e574fd6d10cfb70e3e71ce4c8c023f.gif)
亚马逊云科技多项新功能与服务,助力各种规模的组织拥抱生成式 AI
从初创企业到大型企业,各种规模的组织都纷纷开始接触生成式 AI 技术。这些企业希望充分利用生成式 AI,将自身在测试版、原型设计以及演示版中的畅想带到现实场景中,实现生产力的大幅提升并大力进行创新。但是,组织要怎样才能在企业…...
![](https://www.ngui.cc/images/no-images.jpg)
网站布局都有哪些?
网站布局是指网页中各元素的布局方式,以下是一些常见的网站布局: 栅格布局:将页面分成一个个小格子,再把内容放到对应的格子中。这种布局有利于提高网页的视觉一致性和用户体验,是网站设计中最常用的布局方式之一。流…...
![](https://www.ngui.cc/images/no-images.jpg)
第17章 MQ(一)
17.1 谈谈你对MQ的理解 难度:★ 重点:★★ 白话解析 MQ也要有一跟主线,先理解它是什么,从三个方面去理解就好了:1、概念;2、核心功能;3、分类。 1、概念:MQ(Message Queue),消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队…...
![](https://img-blog.csdnimg.cn/img_convert/14b676b5b13046a760c866c2a4c836d8.png)
LeetCode算法刷题(python) Day41|09动态规划|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
目录 动规五部曲LeetCode 509. 斐波那契数LeetCode 70. 爬楼梯LeetCode 746. 使用最小花费爬楼梯 动规五部曲 确定dp数组以及下标的含义确定递归公式dp数组如何初始化确定遍历顺序举例推导dp数组 LeetCode 509. 斐波那契数 力扣题目链接 本题最直观是用递归方法 class Sol…...
![](https://img-blog.csdnimg.cn/b419ea397c914068ad55ef6950281a7b.png)
Spring(四)
1、Spring6整合JUnit 1、JUnit4 User类: package com.songzhishu.spring.bean;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;/*** BelongsProject: Spring6* BelongsPackage: com.songzhishu.spring.bean*…...
![](https://www.ngui.cc/images/no-images.jpg)
2023-10-8讯飞大模型部署2024秋招后端一面(附详解)
1 mybatis的mapper是什么东西 在MyBatis中,mapper是一个核心概念,它起到了桥梁的作用,连接Java对象和数据库之间的数据。具体来说,mapper可以分为以下两个部分: Mapper XML文件: 这是一个XML文件ÿ…...
![](/images/no-images.jpg)
企业网上登记注册平台/seo软件视频教程
1_zclevel level 战场等级atitle 联盟给的头衔IDhtitle 部落给的头衔IDatitlestring 联盟给的头衔文字 一般做公告显示htitlestring 部落给的头衔文字一般做公告显示xp 升级需要经验值addspell 给予的BUFFaddtalent …...
![](https://img-blog.csdnimg.cn/2019121018154816.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2VpZWllaTQzOA==,size_16,color_FFFFFF,t_70)
做淘宝优惠网站/武汉网络推广seo
Vue-Element中结合后台的特定的数据给实现考勤表格 思路 草图设计 结果页面 实现中 卡住 的地方 动态列增加单元格动态增加新的表格动态增加的列与对应的数据显示 解决方案 动态增加 固定列的数据重新赋值,动态列的数据push进去单元格动态增加新的表格 单元格te…...
![](https://img-blog.csdnimg.cn/img_convert/93421e8252ec639f8ff635dcfa1f5fdd.png)
杭州网页设计培训课程/百度seo推广怎么做
计算机之间的通信是以协议为基础的,客户端(用户)和服务端(网站)都按照协议的约定进行通信。HTTP的状态码就在HTTP的协议内,规定了很多的状态。客户端请求服务端后,服务端就返回结果,…...
![](/images/no-images.jpg)
我有服务器和模板怎么做网站/白度
一、看门狗原理 在产品化的嵌入式系统中,为了使系统在异常情况下能自动复位,一般都需要引入看门狗。 看门狗其实就是一个可以在一定时间内被复位的计数器。当看门狗启动后,计数器开始自动计数,经过一定时间,如果没有…...
![](https://www.oschina.net/img/hot3.png)
广告网站设计方案/公司网站优化方案
2019独角兽企业重金招聘Python工程师标准>>> GC所关注的是哪一部分内存的回收? GC所关注的一般是指Java堆和方法区内存。因为程序计数器、虚拟机栈、本地方法栈这三个区域都是随线程而生,随线程而灭。 GC如何判断对象是否存活? GC…...
![](/images/no-images.jpg)
网站开发背景400字/营销网络图
/* 设置uitabr 样式 此方法需要设置了viewControllers 后设置了后调用 tabBar.viewControllers [NSArray arrayWithObjects:nav1,nav2,nav3,nil]; */ -(void) setUITabBarStyle :(UITabBarController *)tabBar { for(UIView *view in tabBar.tabBar.subviews) { if([vie…...