网页抓取 加密html(五篇Node.js构建一个网站应用)
优采云 发布时间: 2022-04-15 20:31网页抓取 加密html(五篇Node.js构建一个网站应用)
2021-07-25
看了五篇关于 Node.js 的文章,你基本上可以开始构建一个 网站 应用了。首先,通过这篇文章学习一些关于构建网站的知识!
主要是基本的东西...
如何创建路由规则,如何提交表单并接收表单项的值,如何加密密码,如何提取页面的公共部分(相当于用户控件和母版页)等等……
让我们一步一步开始吧^_^!…
新建快递项目,自定义路由规则
1.先用命令行express+ejs创建一个项目sampleEjsPre
cd 工作目录
express -e sampleEjsPre
cd sampleEjsPre && npm install
2.默认情况下,routes 目录下会有 index.js 和 users.js 文件。为了避免示例之外的其他麻烦,删除user.js文件
3.打开app.js文件,删除以下两行代码
var users = require('./routes/users');
...
app.use('/users', users);
4.将以下代码添加到app.js文件中
var subform = require('./routes/subform');
var usesession = require('./routes/usesession');
var usecookies = require('./routes/usecookies');
var usecrypto = require('./routes/usecrypto');
...
app.use('/subform', subform);
app.use('/usesession', usesession);
app.use('/usecookies', usecookies);
app.use('/usecrypto', usecrypto);
通过URL访问后,根据路由规则先到哪个文件再到哪个文件的过程在上一篇文章(Nodejs学习笔记(五)---快递安装入口和模板引擎ejs)) 说了这么多,这里就不多说了!
5.在routes目录下添加subform.js、usesession.js、usecookies.js、usecrypto.js文件,并在对应的js文件中添加如下代码
子窗体.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('subform', { title: '提交表单及接收参数示例' });
});
module.exports = router;
使用session.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('usesession', { title: '使用session示例' });
});
module.exports = router;
使用cookies.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.render('usecookies', { title: '使用cookies示例' });
});
module.exports = router;
使用crypto.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.render('usecrypto', { title: '加密字符串示例' });
});
module.exports = router;
6.views目录下添加subform.ejs、usesession.ejs、usecookies.ejs、usecrypto.ejs文件,views目录下除error.ejs外的所有ejs文件添加如下代码
首页
如何提交表单并接收参数?
如何使用session?
如何使用cookies?
如何字符串加密?
7.添加8000端口*敏*感*词*并在app.js中运行
...
app.listen(8000);
...
运行界面如下:
点击每个链接都可以正常跳转到对应的页面!这样,目录的第一步就到了!
如何提取页面中的公共部分?
上一步创建的 网站 中的每个页面都差不多,现在只有导航部分吗?你必须写每一页吗?当然不是,我们可以提取
1.在views目录下新建nav.ejs文件,添加如下代码
首页
如何提交表单并接收参数?
如何使用session?
如何使用cookies?
如何字符串加密?
2.将views目录下的index.ejs、subform.ejs、usesession.ejs、usecookies.ejs、usecrypto.ejs修改为如下代码
运行页面,发现和上次运行的时候并没有什么不同。采用这种方式,更有利于减少重复代码,更有利于统一布局!
Express 提供 include 嵌入其他页面,类似于 html 嵌入其他页面
如果你用过express2.0版本,你会发现当时并没有这个include,而是使用了一个模板文件layout.ejs来布局!
如何提交表单和接收参数?
如果要做一个网站应用,难免会遇到表单提交和获取参数值。让我们看看如何使用 node.js + express
我们先建一个表单来简单模拟登录GET方式提交数据
1.打开subform.ejs文件,修改文件代码如下:
用户名:
密码:
2.打开subform.js我们尝试接收参数值并输出到控制台
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
var
userName = req.query.txtUserName,
userPwd = req.query.txtUserPwd,
userName2 = req.param('txtUserName'),
userPwd2 = req.param('txtUserPwd');
console.log('req.query用户名:'+userName);
console.log('req.query密码:'+userPwd);
console.log('req.param用户名:'+userName2);
console.log('req.param密码:'+userPwd2);
res.render('subform', { title: '提交表单及接收参数示例' });
});
module.exports = router;
3.运行,并提交表单在浏览器中运行::8000/subform,输入表单项并提交,可以发现url变了
可以发现,在我的表单中输入和要提交的值出现在了url中!
我们再来看看控制台输出
我们完成了GET方法提交表单并收到了值,还不错^_^!(后面会讲取值的方法和区别)
然后在上面代码的基础上,修改form的方法,简单模拟登录POST方法提交数据
1.首先修改subform.ejs文件中的form标签如下:
...
2.在subform.js中添加代码,接收post提交,接收参数并输出到控制台
...
router.post('/',function(req, res){
var
userName = req.body.txtUserName,
userPwd = req.body.txtUserPwd,
userName2 = req.param('txtUserName'),
userPwd2 = req.param('txtUserPwd');
console.log('req.body用户名:'+userName);
console.log('req.body密码:'+userPwd);
console.log('req.param用户名:'+userName2);
console.log('req.param密码:'+userPwd2);
res.render('subform', { title: '提交表单及接收参数示例' });
});
...
3.运行,并提交表单在浏览器中运行::8000/subform,输入表单项并提交,可以发现url不会变
改成post方法后,你会发现form中输入的值和要提交的值不会像get方法提交一样出现在url中!
我们再来看看控制台输出
好的,我们已经完成了表单的发布和参数的接收!
我们回过头来看看接收值的 GET 和 POST 方法,从直接效果的角度来看
req.query:我用来接收GET提交参数
req.body:我用来接收 POST 提交的参数
req.params:都可以接收
我们看一下Express的Request部分的API:#req.params
这里我将重点讲解req.body。Express 通过中间件 bodyParser 处理这个 post 请求。可以看到app.js中有一段代码
...
var bodyParser = require('body-parser');
...
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
...
如果没有这个中间件 Express,我不知道如何处理这个请求。它通过 bodyParser 中间件分析 application/x-www-form-urlencoded 和 application/json 请求,并将变量存储在 req.body 中。只有这样我们才能得到它!
如何加密字符串?
当我们提交表单时,如密码等敏感信息,如果我们不对其进行加密,我们将不会认真对待用户的隐私信息。Node.js 提供加密模块 Crypto
让我们用一个例子
1.打开usecrypto.js,修改代码如下:
var express = require('express');
var router = express.Router();
var crypto = require('crypto');
/* GET home page. */
router.get('/', function(req, res) {
res.render('usecrypto', { title: '加密字符串示例' });
});
router.post('/',function(req, res){
var
userName = req.body.txtUserName,
userPwd = req.body.txtUserPwd;
//生成口令的散列值
var md5 = crypto.createHash('md5'); //crypto模块功能是加密并生成各种散列
var en_upwd = md5.update(userPwd).digest('hex');
console.log('加密后的密码:'+en_upwd);
res.render('usecrypto', { title: '加密字符串示例' });
});
module.exports = router;
2.打开usecrypto.ejs,修改代码如下
用户名:
密码:
3.运行,输入并提交表单,查看控制台输出
MD5加密成功!
使用 createHash(algorithm) 方法,该方法使用给定的算法生成哈希对象
Node.js 提供的加密模块非常强大。Hash算法提供MD5、sha1、sha256等,可根据需要使用
update(data, [input_encoding]) 方法可以通过指定的input_encoding和传入的data数据更新hash对象。'等待)
digest([encoding]) 方法计算数据的哈希摘要值。编码是一个可选参数。如果不通过,则返回一个缓冲区(编码可以是'hex'、'base64'等);当调用摘要方法时,哈希对象将不可用。;
如何使用会话?
Internet 通信协议分为两类:有状态和无状态。对web开发有一定了解的人应该都知道http是一种无状态协议。客户端向服务器发送请求以建立连接。请求响应后,连接中断,服务端不记录状态,所以服务端想
要确定哪个客户端提交了请求,必须借助一些东西来完成,即会话和cookie。下面说说nodejs下的session和使用session吧!
session存在于服务器端,需要cookies的协助才能完成;server端和client端通过session id建立连接(具体的session和cookies如何配合,可以自己补充一些相关知识,这里只简单提一下,不展开),否则这个文章会更复杂^_^!)
在express中,可以使用中间件来使用session,express-session()可以存在于内存中,也可以存在于mongodb、redis等...
更多中间件:
下面通过一个例子来看看如何使用session(内存模式)
示例设计思路:使用两个页面,一个登录,两个页面判断是否有这个会话,如果有,显示登录,如果没有,显示一个登录按钮,点击这个按钮记录会话
1.首先通过npm安装中间件,打开package.json文件,在dependencies节点下添加键值对 "express-session" : "latest"
"dependencies": {
...,
"express-session" : "latest"
}
最新的:最新的
2. cd 到项目根目录并执行 npm install
3.打开 app.js 并添加以下代码
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
...
//这里传入了一个密钥加session id
app.use(cookieParser('Wilson'));
//使用靠就这个中间件
app.use(session({ secret: 'wilson'}));
...
这些选项就不做解释了,通过上面中间件的链接,自己看看
4.这里我以usesession和usecookies为例,修改js和ejs如下
usesession.ejs 和 usecookies.ejs
用户已登录
使用.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
if(req.session.islogin)
{
console.log('usesession:' + req.session.islogin);
res.locals.islogin = req.session.islogin;
}
res.render('usesession', { title: '使用session示例' });
});
router.post('/', function(req, res) {
req.session.islogin = 'success';
res.locals.islogin = req.session.islogin;
res.render('usesession', { title: '使用session示例' });
});
module.exports = router;
使用cookies.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
if(req.session.islogin)
{
console.log('usecookies:' + req.session.islogin);
res.locals.islogin = req.session.islogin;
}
res.render('usecookies', { title: '使用cookies示例' });
});
router.post('/', function(req, res) {
req.session.islogin = 'success';
res.locals.islogin = req.session.islogin;
res.render('usecookies', { title: '使用cookies示例' });
});
module.exports = router;
5.运行查看
第一次运行时,查看两个页面,效果如下:
6.点击登录按钮后查看这两个页面
7.关闭浏览器再打开就可以看到这两个页面,如步骤5的截图所示
session使用成功!
官方示例:
如何使用cookies?
如果是登录,一般会使用“记录密码”或者“自动登录”功能,一般是通过cookies来完成
cookie存在于客户端,安全性较低。通常,应存储加密信息。建议设置使用过期时间或不使用时删除。
Express 也可以与中间件一起使用:
老套路,通过一个例子来了解一下
示例设计思路:在上述会话示例的基础上,登录并在usecookies部分记录cookies自动登录
1.根据上面的会话示例修改usecookies.js
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
if(req.cookies.islogin)
{
console.log('usecookies-cookies:' + req.cookies.islogin);
req.session.islogin = req.cookies.islogin;
}
if(req.session.islogin)
{
console.log('usecookies:' + req.session.islogin);
res.locals.islogin = req.session.islogin;
}
res.render('usecookies', { title: '使用cookies示例' });
});
router.post('/', function(req, res) {
req.session.islogin = 'success';
res.locals.islogin = req.session.islogin;
res.cookie('islogin', 'sucess', { maxAge: 60000 });
res.render('usecookies', { title: '使用cookies示例' });
});
module.exports = router;
2.运行访问:8000/usecookies,点击登录按钮登录成功并记录cookies
maxAge 是过期时间,单位是毫秒,我设置的是一分钟
3.关闭浏览器,再次访问:8000/usecookies,页面显示已登录
4.再次关闭浏览器,一分钟后再次访问:8000/usecookies,页面不再登录,但显示登录按钮,表示cookies已过期,不会自动登录
使用cookies也成功了!
官方示例:
如何清除会话和 cookie?
清算很简单,不用举例说明。如果您有兴趣定义自己的路由规则,请尝试
//清除cookies
res.clearCookie('islogin');
//清除session
req.session.destroy();
写在之后
文中提到的一些知识点,其实可以用一整篇文章来讨论。这篇文章的基本原则是看后能用;
如果想了解原理或更相关的知识,可以花点时间去了解,或者找一些资料丰富一下。当然,您也可以留言。如果我不认为我在胡说八道,我会尽力回答^_^!
本系列的源代码可供下载。