nodejs框架express实现登录 nodejsweb框架

   2023-02-08 学习力0
核心提示:目录:访问视图Post请求Post请求 - body(1)Post请求 - body(2)Post登陆1Post登陆2页面访问控制1页面访问控制2访问视图前面我们已经添加了视图模板并学习了访问视图的方法,那我们就先回顾一下。1.参考以下代码,地址栏访问这几个请求路径查看是否可以成功。app

目录:

  1. 访问视图
  2. Post请求
  3. Post请求 - body(1)
  4. Post请求 - body(2)
  5. Post登陆1
  6. Post登陆2
  7. 页面访问控制1
  8. 页面访问控制2

访问视图

前面我们已经添加了视图模板并学习了访问视图的方法,那我们就先回顾一下。

1.参考以下代码,地址栏访问这几个请求路径查看是否可以成功。

app.get('/', function(req, res) {
  res.render('index');
});
 
app.get('/login',function(req,res){
  res.render('login');
});
 
app.get('/home',function(req,res){
  res.render('home');
});

 

当浏览器看到了相应的视图页面就说明我们的代码是没有问题的,继续加油吧!

 

用户登陆

前面我们学习了express的get请求方法,今天我们就学习它的post请求方法。

1. post方法 —— 根据请求路径来处理客户端发出的Post请求。

2. 格式:app.post(path,function(req, res));

3. 和get方法一样,path为请求的路径,第二个参数为处理请求的回调函数,req和res分别代表请求信息和响应信息。

4. 例如处理login的post请求,如下示例

app.post('/login',function(req,res){
});

 

了解了post方法,下面我们就开始使用post来实现简单的用户登陆功能。

 

body基本用法

实现登陆之前我们先来了解一个属性 —— body。

body属性解析客户端的post请求参数,通过它可获取请求路径的参数值。

格式:req.body.参数名;

下面我们就来测试body属性的功能,做一些准备工作。

1. 修改login.html,为登陆按钮增加登陆事件。

<input type="button" onclick="login();" value="登 陆">

 

function login(){
    var username = $('#username').val();
    var data = { "username": username };
    $.ajax({
        url:'/login',
        type:'POST',
        data:data
    });
}        

 

2. 要想使用body属性解析post请求参数值,我们需要先安装和引用express的两个中间件body-parser和multer,具体方法如下:。

2.1 安装

npm install body-parser
npm install multer

2.2 引用和调用

var bodyParser = require('body-parser');
var multer = require('multer');
......
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());

 

中间件body-parser和multer用于处理和解析post请求的数据。

body基本用法

到这里我们就可以测试post请求的body属性的简单用法了。

1. 修改好之后的完整的文件app.js如下所示:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var multer = require('multer');
 
app.set('views', __dirname);
app.set( 'view engine', 'html' );
app.engine( '.html', require( 'ejs' ).__express );
 
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
 
app.get('/',function(req,res){
  res.render('login');
});
app.post("/login", function(req, res) {
  console.log("用户名称为:" + req.body.username);
});
 
app.listen(80);

准备登陆

接下来我们就开始实现登陆功能,让我们要先做一些准备工作,为相关按钮添加点击事件、链接。

1. 修改index.html,增加登陆链接。

<p><a href="login">登 录</a></p>

2.强化login页面的login方法,实现一个简单的post请求:

function login(){
  var username = $('#username').val();
  var password = $('#password').val();
  var data = { "username": username, "password":password};
  $.ajax({
    url:'login',
    type:'POST',
    data:data,
    success:function(data,status){
      if(status == 'success'){
        location.href='home';
      }
    },  
    error:function(data,status,e){
      if(status == "error"){
        location.href='login';
      }
    }
  });
}

 

网页模板准备已经就绪,下面我们开始修改启动文件app.js的内容。

 

准备登陆

下面我们就开始修改app启动文件的内容。

1. 修改post方法,这里假设数据库中用户名的名字为admin、密码为admin。

app.post('/login',function(req,res){
  var user={
    username:'admin',
    password:'admin'
  }
  if(req.body.username==user.username&&req.body.password==user.password)
  {
    res.send(200);
  }else{
    res.send( 404 );
  }
});

 

2. 一个完整的启动文件app.js如下所示:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var multer = require('multer');
 
app.set('views', __dirname);
app.set( 'view engine', 'html' );
app.engine( '.html', require( 'ejs' ).__express );
 
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
 
app.get('/', function(req, res) {
  res.render('index');
});
app.get('/home',function(req,res){
  res.render('home');
});
app.get('/login',function(req,res){
  res.render('login');
});
app.post('/login',function(req,res){
  var user={
    username:'admin',
    password:'admin'
  }
  if(req.body.username==user.username&&req.body.password==user.password) {
    res.send(200);
  }else{
    res.send( 404 );
  }
});
 
app.listen(80);

到这里,一个简单的Post登录就完成了,使用浏览器运行本地端口试试效果吧!

访问控制

简单登陆部分按照我们的求已经完成了,但网站好些并不安全,反复测试我们发现,home.html页面本来是登陆以后才访问的,现在我们不需登陆,直接在浏览器输入也可访问,这样肯定是不能被允许的,那么我们还得再次对登陆功能进行强化。

1. login.html页面增加EJS模板变量<%- message %>保存登陆提示信息。

...
<%- message %>
<h1>用户登录</h1>
...

2. home.html页面,登陆成功后跳转并传入用户名:

<h1>恭喜<em style="color:red"><%= user.username %></em>,登陆成功!</h1>

PS:使用EJS模板变量值使用<%= variable_name %>输出方式,字符串输出时默认经过escape转义编码。 当我们想要输出一些动态生成的HTML标签时可使用<%- variable_nam %>输出方式,这种方式不会被escape转义编码。

3. home.html页面添加退出链接,如下:

<p><a href="logout">退 出</a></p>

访问控制

修改好了模板页,下面开始修改启动文件app.js的内容。

1. 安装模块express-session并引用,安装、引用不在讲述。

2. 使用新模块进行访问时间限制,如下:

var session = require('express-session');
...
app.use(session({
    secret:'secret',
    resave:true,
    saveUninitialized:false,
    cookie:{
        maxAge:1000*60*10 //过期时间设置(单位毫秒)
    }
}));

3. app.js文件新增中间件并设置模板变量值,如下:

app.use(function(req, res, next){
  res.locals.user = req.session.user;
  var err = req.session.error;
  res.locals.message = '';
  if (err) res.locals.message = '<div style="margin-bottom: 20px;color:red;">' + err + '</div>';
  next();
});

res.locals对象保存在一次请求范围内的响应体中的本地变量值。

PS:注意,中间件的放置顺序很重要,等同于执行顺序。而且,中间件必须放在HTTP动词方法之前,否则不会执行。

4. 增加logout路径处理(用户登陆退出)和index路径请求处理,如下:

app.get('/logout', function(req, res){
  req.session.user = null;
  req.session.error = null;
  res.redirect('index');
});
app.get('/index', function(req, res) {
  res.render('index');
});

5. 修改home路径请求处理,如下:

app.get('/home',function(req,res){
  if(req.session.user){
    res.render('home');
  }else{
    req.session.error = "请先登录"
    res.redirect('login');
  }
});

6. 修改路径为login的Post请求

app.post('/login',function(req,res){
  var user={
    username:'admin',
    password:'admin'
  }
  if(req.body.username==user.username&&req.body.password==user.password){
    req.session.user = user;
    res.send(200);
  }else{
    req.session.error = "用户名或密码不正确";
    res.send( 404 );
  }
});

 参考资料:http://www.dwz.cn/3e6UbG

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 打造自己的 nodejs 静态文件服务器(帖子内容,
    用NodeJS打造你的静态文件服务器在《The Node Beginner Book》的中文版(http://nodebeginner.org/index-zh-cn.html)发布之后,获得国内的好评。也有同学觉得这本书略薄,没有包含进阶式的例子。@otakustay同学说:“确实,我的想法是在这之上补一个简单的MV
    02-10
  • NodeJS无所不能:细数10个令人惊讶的NodeJS开源
    在几年的时间里,NodeJS逐渐发展成一个成熟的开发平台,吸引了许多开发者。有许多大型高流量网站都采用NodeJS进行开发,像PayPal,此外,开发人员还可以使用它来开发一些快速移动Web框架。  除了Web应用外,NodeJS也被应用在许多方面,本文盘点了NodeJS在其
    02-10
  • Linux环境下的Nodejs linux安装基本环境
    最近在学习Node.js,在window下总是觉得不那么爽快。最简单而且环保的方法是在虚拟机中安装一个Linux。 { 1.Linux:家中的Linux为Centos。 2.VirtuallyBox: 开启2块网卡。第一个选Host-Only目的是为了让虚拟机通上网。第二块选Bridge Adapter,这是为了
    02-09
  • nodejs package.json说明
    {"name": "test", //项目名称(必须),由小写英文字母、数字和下划线,不能含空格"version": "1.0.0", //项目版本(必须)"description": "This is for study gulp project !", //项目描述(必须)"homepage": "", //项目主页url " key
    02-09
  • 017 nodejs取参四种方法req.body,req.params,re
    摘要: nodejs取参四种方法req.body,req.params,req.param,req.body 获取请求很中的参数是每个web后台处理的必经之路,nodejs提供了四种方法来实现。获取请求很中的参数是每个web后台处理的必经之路,nodejs的 express框架 提供了四种方法来实现。req.bodyre
    02-09
  • Docker windows下安装并搭建Nodejs的webapp
    Docker windows下安装并搭建Nodejs的webapp
    一、关于Docker什么是Docker?Docker 采用go语言编写,是一个开源的应用容器引擎。让开发者可以快速打包他们的应用以及依赖包到一个封装的可移植的容器Image中,然后发布到任何流行的机器( Linux ,windows,Mac等)上,也可以实现虚拟化。容器是使用完全
    02-09
  • Nodejs+Express+Mysql实现简单用户管理增删改查
    Nodejs+Express+Mysql实现简单用户管理增删改查
     源码地址  https://github.com/king-y/NodeJs/tree/master/user目录结构  mysql.jsvar mysql = require('mysql');var pool = mysql.createPool({host : '127.0.0.1',user : 'root',password : '',database : 's79'});exports.que
    02-09
  • nodejs查看本机hosts文件域名对应ip
    const dns = require('dns')dns.lookup('domainName', function(err, result) {console.log(result)}) related:https://***.com/questions/36689536/how-to-resolve-hostname-to-an-ip-address-in-node-js
    02-09
  • nodejs process.memoryUsage() rss等参数啥含义
    nodejs process.memoryUsage() rss等参数啥含义
    1 前言使用process.memoryUsage() ,然后可以得到一个对象如下:{ rss: 4935680,heapTotal: 1826816,heapUsed: 650472,external: 49879}  然而不知道rss是什么缩写,不知道其含义,网上找了一圈,多数都没说到点上,我这边就补充一下,也作为记录使用。2 
    02-09
  • nodejs工程拷贝后运行报module找不到问题
    工程文件夹通过复制黏贴到另外一个地方,运行后报错 “can`t find module 某某某”,查看原因:输入node 进入控制台,输入console.log(module.paths)查看当前nodejs查找module的路径,如果没有工程里的node_modules,通过module.paths.push加入,检查是否有效
    02-09
点击排行