当前位置: 首页 > news >正文

Nodejs--构建web应用

构建web应用

将从http模块中的服务器端中的request使劲按开始分析,request时间发生于网络连接建立,客户端想服务器发送报文,服务器解析报文,发现http请求的报文的时候,在出发request事件之前,已经准备好ServerRequest和ServerResponse对象以供请求和响应报文的操作。

var http = require('http')
http.createServer(function(req, res) {res.writeHead(200,{'Content-Type':'text/plain'})res.end(1337,'127.0.0.1://1337/')
})
  1. 请求方法的判断
  2. URL的路径解析
  3. URL中查询字符串解析
  4. Cookie的解析
  5. Basic认证
  6. 表单数据的解析
  7. 任意格式文件的上传处理

请求方法

HTTP_Parser解析请求报文的时候,将报文头抽取出来,设置为req.method,通常,只要处理get和post请求方法,但是在RESTful类的web服务器中请求方法十分重要,会决定资源的操作行为,PUT代表新建一个资源,post表示更新一个资源,get表示查看一个资源。delete表示删除一个资源。

路径解析

HTTP_Parser会解析req.url,路径解析伪代码如下

function(req, res) {var pathname = url.parse(req.url).pathnamefs.readFile(path.join(ROOT, pathname),function(err, file) {if(err) {res.writeHead(404)res.end('找不到文件')return}res.writeHead(200)res.end(file)})
}

查询字符串

?foo=bar&baz=val字符串就是查询字符串形成请求报文首行的第二部分。
转换为JSON对象

var url = require('url')
var querystring = require('querystring')
var query = querystring.parse(url.parse(req.url).query)
//  
var query = url.parse(req.url, true).query

业务的判断要检查值是数组还是字符串,否则会出现typeerror的情况。

Cookie

Cookie认识

Cookie的处理主要分为如下几步

  1. 服务器向客户端发送cookie
  2. 浏览器将cookie保存
  3. 之后浏览器每次都会将cookie发回客户端
    客户端发送的cookie在请求报文的cookie字段中,HTTP_Parser会将所有的报文字段解析到req.headers上,这个cookie就是req.headers.cookies,根据规范中的定义,cookie的值是key=value,key2=value2的形式,如果需要cookie,解析起来不难
var parseCookie = function(cookie) {var cookies = {}if (!cookie) {return cookies}var list = cookie.split(";")for(let i = 0; i < list.lenght; i++) {var pair = list[i].split('=')cookies[pair[0].trim()] = pair[1]}return cookies
}
function (req, res) {req.cookies = parseCookie(req.headers.cookie);hande(req, res);
}
var handle = function (req, res) {res.writeHead(200);if (!req.cookies.isVisit) {res.end('第一次连接 ');} else {res.writeHead(200)res.end('再次连接')}
};

Set-Cookie: name=value; Path=/; Expires=Sun, 23-Apr-23 09:01:35 GMT; Domain=.domain.com

  • path: path表示这个cookie影响到的路径,当前访问的路径不满足该匹配,浏览器不会发送这个cookie
  • Expires Max-Age: 告知浏览器这个Cookie何时过期,如果不设置该选项,在关闭浏览器的时候会丢失这个cookie,如果设置了过期时间,浏览器会将cookie内容写入到磁盘中保存。Expires的值是一个UTC格式的时间字符串,告知浏览器啥时候过期,Max-Age告知浏览器Cookie多久后过期,如客户端的时间和服务器的时间不能匹配,这种时间设置就会出现偏差
  • HttpOnly告知浏览器不允许通过脚本document.cookie去更改这个cookie值
  • Secure: 当Secure的值为true,在HTTP中是无效的,在HTTPS中才有效,表示创建的Cookie只能在HTTPS连接中被浏览器传送到服务器端进行会话验证,如果HTTP连接则不会传递该信息,所以很难被窃听到。

Cookie的性能的影响

由于cookie的实现之际,一旦服务器向客户端发送了设置cookie的意图,除非cookie过期,否则大部分的客户端每次都会请求发送这些cookie到服务器端,一旦设置的cookie过多,会导致报头比较打,大多数的cookie并不需要每次都用上,会造成带宽的部分浪费。

  • 减小cookie的大小
    更严重的是,如果域名在根节点设置cookie,几乎所有的子路径下的请求都会带上这些cookie,这些cookie在某些情况下是有用的,但是有些情况下是完全无用的,静态文件最为典型,静态文件的业务定位不关心状态,cookie对它而言几乎无用,但是一旦又cookie设置到相同的域下,请求就会带上cookie。
  • 为静态组件使用不同的域名
    为不需要cookie的组件换个域名可以实现减少无效的cookie的传输,多有很多网站的静态文件会有特别的域名,使得业务相关的cookie不会影响静态资源,还可以突破浏览器下载线程数量的限制,因为域名不同,可以将下载线程数范围翻倍。但是换用额外的域名会多dns解析
  • 减少DNS查询
    由于现在的浏览器都会进行DNS缓存。

Session

通过Cookie,浏览器和服务器可以实现状态的记录,但是cookie可以在前端和后端进行修改,数据就容易被伪造和篡改。
为了解决Cookie敏感数据的问题,Session出现了,这个Session的数据只保存在服务器端,客户端无法修改,这样数据的安全性得到一定的保证

基于cookie来实现用户和数据的映射

将所有数据都放在Cookie中不可取,但是将口令放在Cookie中还是可以的。因为口令一日被篡改,就丢失了映射关系,也无法修改服务器端存在的数据了。并且Session的有效期通常较短,普遍的设置是20分钟,如果在20分钟内客户端和服务器端没有交互产生,服务器端就将数据删除。由于数据过期时间较短,且在服务器端存储数据,因此安全性相对较高
一旦服务器启用了Session, 将会约定一个键值作为Session口令,这个值可以任意约定,一旦服务器检测到用户请求cookie中没有携带该值,就会生成一个值,这个值是唯一而且不重复的值,并设定超时时间。

var sessions = {}
var key = " session_id"
var EXPIRES = 20 * 60 * 1000
var generate = function () {var session = {}session.id = (new Date()).getTime() + Math.random()session.cookie = {expire: (new Date()).getTime() + EXPIRES}sessions[session.id] = session;return session
}

每个请求到来的时候,会检查cookie中口令和服务器端的数据,如果过期,就会重新生成

function(req, res) {var id =req.cookies[key]if(!id) {req.session = generate() } else {var session = sessions[id]if(session) {if(session.cookie.expire > (new Date()).getTime()) {// 超时session.cookie.expire = (new Date()).getTime() + EXPIRESreq.session = session} else {delete session[id]req.session = generate()}}else {req.session = generate()}}handle(req, res)
}

仅仅重新生成Session不能完成整个流程,还需要在响应给客户端的时候设置新的值,以便下次请求时候能够对应服务器端的数据,

var writeHead = res.writeHead;
res.writeHead = function() {var cookies = res.getHeader('Set-Cookie')var session = serialize('Set-Cookie',req.session.id)cookies = Array.isArray(cookies)?cookies.concat(session):[cookies, session];res.setHeader('Set-Cookie', cookies)return writeHead.apply(this, arguments)
}

至此,session在前后端进行对应的过程就完成了,这样的业务可以判断和设置session,来维护用户和服务器端的关系

//服务器代码
var handle =function(req, res) {if(!req.session.isVisit) {res.session.isVisit = true;res.writeHead(200);res.end('欢迎第一次来到动物园');}else {res.writeHead(200);res.end('动物园再次欢迎你');}
}

通过查询字符串来实现浏览器端和服务器端数据的对应

检查请求的查询字符串,如果没有值,就会先生成带值的URL,然后形成跳转,让客户端重新发起请求,用户访问一个目录,如果发现查询字符串中不带有session_id参数,就会将用户跳转到带有session_id的地址中,如果浏览器受到302状态码和location包头,就会发起新的请求。

Session和内存

Session和安全

相关文章:

Nodejs--构建web应用

构建web应用 将从http模块中的服务器端中的request使劲按开始分析&#xff0c;request时间发生于网络连接建立&#xff0c;客户端想服务器发送报文&#xff0c;服务器解析报文&#xff0c;发现http请求的报文的时候&#xff0c;在出发request事件之前&#xff0c;已经准备好Se…...

C++ 二分查找法【面试】

在C中实现二分查找法是一个常见的面试问题。二分查找法是一种在有序数组中查找特定元素的算法&#xff0c;其时间复杂度为O(log n)。以下是使用C实现二分查找的示例代码&#xff1a; #include <iostream> #include <vector>// 二分查找法函数 int binarySearch(co…...

【Docker】docker-compose常用的构建docker容器的yml文件

docker-compose的简单使用方法&#xff0c;在准备好的文件夹中&#xff0c;mkdir好要挂载的如data或者conf文件夹&#xff0c;及vim docker-compose.yml&#xff0c;将下方的要使用的内容粘贴进去&#xff0c;根据自己需要添加/删除/修改一下。最后在当前文件夹直接后台启动即可…...

华为坤灵路由器初始化开局的注意事项,含NAT配置

坤灵路由器比较坑&#xff0c;无web界面&#xff0c;全程命令行配置&#xff0c;但是版本更新导致和华为企业路由器配置很多不一样的地方&#xff0c;今天介绍下 1、aaa密码复杂度修改&#xff1a; #使能设备对密码进行四选三复杂度检查功能。 <HUAWEI>system-view […...

HTTP!!!

HTTP 一 : 请求报文1.2 : 首行1.3 :请求头(header)1.4 : 空行1.5 : 正文 body 二: 响应报文2.2 : 首行 三 : URL 一 : 请求报文 一个HTTP 请求报文, 分成四个部分 首行 GET https://cn.bing.com/?FORMZ9FD1 HTTP/1.1请求头(header)空行正文(body) 1.2 : 首行 首行又分为三个…...

Mybatis用Map接收返回值可能出现的问题

先看一个示例 明明定义了Map<String,String> 实际内部存放的是Integer resultType是Map 也就是说Mybatis是通过反射将类型放进去的 躲过了编辑器检查 但是这样取值时候就会报类型转换错误 解决方式 resultMap 另外一种方式 用Number Integer和Double的父类 Ma…...

Web爬虫--fofa-资产信息搜集

免责声明:本文仅做技术交流与学习... 目录 fofa.py fofa搜索参数分析 fofa_api.py fofa.py import requests from bs4 import BeautifulSoup# 登录fofa之后,把自己的cookie弄过来. header{cookie: } # 参数为搜索的语法. urlhttps://fofa.info/result?qbase64dGl0bGU9IuS4…...

mySql的事务(操作一下)

目录 1. 简介2. 事务操作3. 四大特性4. 并发事务问题5. 脏读6. 不可重复读7. 幻读事务隔离级别参考链接 1. 简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作…...

UniApp或微信小程序中scroll-view组件使用show-scrollbar在真机Android或IOS中隐藏不了滚动条的解决办法

show-scrollbar 属性 不论是使用 变量 还是直接使用 布尔值或者直接使用 css 都是在 ios、Android 上是都没有效果。。 真机中还是出现滚动条 解决办法 添加下面CSS ::-webkit-scrollbar {display: none;width: 0 !important;height: 0 !important;-webkit-appearance: no…...

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼…...

从C语言到C++(五)

从C语言到C&#xff08;五&#xff09; 自动类型推导尾拖返回类型类型信息推导typeid1. 定义和基本作用2. 使用方法3. 注意事项4. 示例代码5. 关联概念&#xff1a;RTTI decltype基本用法示例注意事项总结 基于范围的增强for循环示例 1&#xff1a;使用数组示例 2&#xff1a;使…...

数据结构——栈(Stack)详解

1. 栈&#xff08;Stack&#xff09; 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中数据元素遵循后进先出LIFO(Last In First Out)的原则 压栈&am…...

1.Element的table表高度自适应vue3+js写法

解决方法 在页面table上添加id&#xff0c;动态计算每页table的最大高度 &#xff0c;将高度保存在store中&#xff0c;每次切换路由时进行计算。 文章目录 解决方法前言一、页面table使用二、store状态库1.引入库 效果 前言 提示&#xff1a;状态管理使用的是pinia,用法参考…...

联想电脑电池只能充到80%,就不在充电了,猛一看以为坏了,只是设置了养护模式。

现在电池管理模式有三种&#xff1a; 1&#xff09;常规 2&#xff09;养护 3&#xff09;快充 好久没有用联想的电脑了&#xff0c;猛一看&#xff0c;咱充到了80%不充了&#xff0c;难道电池是坏的&#xff1f;我们要如何设置才可以让其充电到100%呢&#xff1f; 右下角…...

Unity接入PS5手柄和Xbox手柄以及Android平台的(以及不同平台分析)

Unity接入PS5手柄和Xbox手柄以及Android平台的&#xff08;以及不同平台分析&#xff09; 介绍Unity手柄小知识PC端和编辑器上的摇杆事件和滑动事件PS5手柄Xbox手柄北通手柄 安卓环境下&#xff08;安卓手机或者安卓模拟器&#xff09;PS5手柄Xbox手柄北通手柄 总结 介绍 最近…...

vue+java实现简易AI问答组件(基于百度文心大模型)

一、需求 公司想要在页面中加入AI智能对话功能&#xff0c;故查找免费gpt接口&#xff0c;最终决定百度千帆大模型&#xff08;进入官网、官方文档中心&#xff09;&#xff1b; 二、主要功能列举 AI智能对话&#xff1b;记录上下文回答环境&#xff1b;折叠/展开窗口&#…...

刷代码随想有感(104):动态规划——01背包问题/二维dp数组

题干&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,bagweight; void solve(){vector<int>weight(n, 0);vector<int>value(n, 0);for(int i 0; i < n; i){cin>>weight[i];}for(int j 0; j < n; j){cin>…...

Docker-Portainer可视化管理工具

Docker-Portainer可视化管理工具 文章目录 Docker-Portainer可视化管理工具介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、拉取Portainer汉化版本镜像四、运行容器五、访问可视化界面 介绍 Portainer是一款开源的容器管理平台&#xff0c;它提供了一个直观易用的…...

SqlSugar 集成

1 关于 SqlSugar SqlSugar 是 .NET/C# 平台非常优秀的 ORM 框架&#xff0c;目前 Nuget 总下载突破 700K&#xff0c;Github 关注量也高达 3.2K&#xff0c;是目前当之无愧的国产优秀 ORM 框架之一。 SqlSugar 官方地址&#xff1a;果糖网 &#xff08; SqlSugar 官网 &#…...

MySQL Connector/C++ 和 MySQL Connector/ODBC 的区别

MySQL Connector/C++ 和 MySQL Connector/ODBC 是两种不同的数据库连接工具,它们各自有不同的特点和用途。以下是它们之间的一些主要区别: 1. **编程接口**: - MySQL Connector/C++ 提供了面向对象的编程接口,它是用C++编写的,提供了C++特有的类和对象来与MySQL数据库…...

Weevil-Optimizer象鼻虫优化算法的matlab仿真实现

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Weevil-Optimizer象鼻虫优化算法的matlab仿真实现&#xff0c;仿真输出算法的优化收敛曲线&#xff0c;对比不同的适应度函数。 2.测试软件版本以及运行结果展示…...

Web前端项目-交互式3D魔方【附源码】

交互式3D魔方 ​ 3D魔方游戏是一款基于网页技术的三维魔方游戏。它利用HTML、CSS和JavaScript前端技术来实现3D效果&#xff0c;并在网页上呈现出逼真的魔方操作体验。 运行效果&#xff1a; 一&#xff1a;index.html <!DOCTYPE html> <html><head><…...

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄&#xff1f;AVI作为一种广泛支持的视频格式&#xff0c;能够在多种设备和播放器上顺畅播放&#xff0c;确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次&#xff0c;AVI格式通常具有较好的兼容性&#xff0c;能够避免格式转换过程中…...

UniRx 入门

Reactive X 是 Reactive Extensions 的缩写&#xff0c;一般简写为 Rx&#xff0c;最初是 LINQ 的一个扩展&#xff0c;由微软的团队开发&#xff0c;Rx 是一个编程模型&#xff0c;目标是提供一致的编程接口&#xff0c;帮助开发者更方便的处理异步数据流&#xff0c;支持大部…...

简单游戏制作——飞行棋

控制台初始化 int w 50; int h 50; ConsoleInit(w, h); static void ConsoleInit(int w, int h) {//基础设置//光标的隐藏Console.CursorVisible false;//舞台的大小Console.SetWindowSize(w, h);Console.SetBufferSize(w, h); } 场景选择相关 #region 场景选择相关 //声…...

等保一体机

等保一体机是面向等保场景推出的合规型安全防护产品。基于“一个中心&#xff0c;三重防护”的设计理念&#xff0c;通过内置全面、多样的安全能力&#xff0c;为政府、医疗、教育、企业等中小型客户提供快速合规、按需赋能的一站式等保合规解决方案。 等保一体机要求管理网络和…...

什么是寄存器文件(Register File)?

寄存器文件&#xff08;Register File&#xff09;是计算机系统中用于存储处理器操作数的小型、快速的存储单元集。它在 CPU 内部&#xff0c;提供极高的访问速度&#xff0c;通常用于存储临时数据、操作数和指令执行过程中的中间结果。 寄存器文件的组成和特点 寄存器集&…...

6月15号作业

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0…...

零基础入门学用Arduino 第三部分(三)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…...

Trusty qemu + android环境搭建详细步骤

下载源码 mkdir trusty cd trusty repo init -u https://android.googlesource.com/trusty/manifest -b master repo sync -j32 编译 ./trusty/vendor/google/aosp/scripts/build.py generic-arm64 查看编译结果 ls build-root/build-generic-arm64/lk.bin 安装运行依赖 …...

做网站的抬头标语怎么/网络营销软件

偶然间在微信公众号奇舞周刊上看到了这篇文章《CSS Painting API》&#xff0c;算是对 conic-gradient的初次见面。 后来有空的时候&#xff0c;百度搜了一下&#xff0c;看了这篇文章《CSS神奇的conic-gradient圆锥渐变》后&#xff0c;对conic-gradient有了深刻的了解。 概述…...

广州网站优化公司/关键词排名查询工具

“初入职场什么都不懂&#xff0c;天天追着职场前辈问东问西&#xff0c;还觉得理所应当。直到后来……我也成了公司老人&#xff0c;每一次的崩溃&#xff0c;都让我对曾经带我的师傅又多了一分理解。” 让很多“师傅”气到头秃、急到跳脚的不是“萌新”不萌&#xff0c;而是“…...

网站建设公司导航/公司网络推广网站

chrony有两个核心组件&#xff0c;分别是&#xff1a;chronyd&#xff1a;是守护进程&#xff0c;主要用于调整内核中运行的系统时间和时间服务器同步。它确定计算机增减时间的比率&#xff0c;并对此进行调整补偿。chronyc&#xff1a;提供一个用户界面&#xff0c;用于监控性…...

淄博logo设计公司/淘宝优化

详细解答与dp序列初始化请见Carl大佬&#xff1a;点击链接 动态规划序列含义&#xff1a; dp[持有股票][不持股票] 持有股票&#xff1a; 应该为最便宜的股票&#xff0c;&#xff08;积累问题→\rightarrow→&#xff09;或者是在上一次&#xff08;不一定刚刚就是上一支就…...

网站建设规划书模板/重庆高端品牌网站建设

题目描述 伦敦奥运会要到了&#xff0c;小鱼在拼命练习游泳准备参加游泳比赛&#xff0c;可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。这一天&#xff0c;小鱼给自己的游泳时间做了精确的计时&#xff08;本题中的计时都按24小时制计算&#xff09;&#xff0c;它发现自己…...

主题网站设计模板/百度模拟搜索点击软件

准备好滚滚的JOE – Java on Everything吗&#xff1f; Java on Everything掌握了如何在几乎所有内容上运行Java的关键。 没有操作系统&#xff1f; 没问题。 JOE无需操作系统即可工作。 放弃操作系统的好处是什么&#xff1f; Java on Everything是由约瑟夫库里格&#xff08…...