zoukankan      html  css  js  c++  java
  • NodeJS第5天笔记

     

    一、数据库

    二、Cookie和Session

    2.1 Cookie

    4.2 Session

    4.3 Session的使用

    4.4、express-session的常用参数

    4.5、express-session 的常用方法:

    4.6、负载均衡配置 Session,把 Session 保存到数据库里面

    4.7、登录案例:

    一、数据库

    分页,想想我们的百度百家Ajax案例,当时调用了百度的JSON,有一个参数叫做page=3,生成的JSON不一样。

    这个就是分页,就是我们想寻找所有的新闻,但是是位于第3页的新闻。那么有两种做法:

    1) 错误的做法: 就是讲所有的result都读取到数组,然后进行数据操作,进行分页;

    2) 正确的做法: 就是真的在数据库中,只读取这么多内容。

     

    错误的,我们试图每次都读取全部数据,但是这样开销很大。

    var a = [];

    db.find("student",{},function(err,result){

    for(var i = 10 * page ; i < 10 * (page + 1) ; i++){

    a.push(result[i]);

    }

    res.send(a);

    });

     

    所以,mongodb提供了傻傻的两个函数。

    limit() skip()

     

    加入,第一页是page=0。每页10条,所以当前页的查询语句

    db.student.find({}).limit(10).skip(page*10)

     

    数据总数怎么得到?

    shell中

    db.student.stats().count;

    ejs页面中,如果我们想使用underscore的模板,就会有模板冲突的问题。

    underscore用的:

    <script type="text/template" id="moban">

    <div class="list-group">

    <a href="#" class="list-group-item active">

    <h4 class="list-group-item-heading"><%= xingming %></h4>

    <p class="list-group-item-text"><%= liuyan %></p>

    </a>

    </div>

    </script>

    ejs以为是自己的模板。所以报错,提示你没有船体xingming参数。

    解决方法就是underscore源码。在源码中搜索<%即可。

    二、Cookie和Session

    2.1 Cookie

    ● HTTP是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到,这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何关系的。

    那么世界就乱套了,比如我上一次访问,登陆了,下一次访问,又让我登陆,不存在登陆这事儿了。

    ● Cookie是一个简单到爆的想法:当访问一个页面的时候,服务器在下行HTTP报文中,命令浏览器存储一个字符串;浏览器再访问同一个域的时候,将把这个字符串携带到上行HTTP请求中。

     

    第一次访问一个服务器,不可能携带cookie。 必须是服务器得到这次请求,在下行响应报头中,携带cookie信息,此后每一次浏览器往这个服务器发出的请求,都会携带这个cookie。

     

    特点

    ● cookie是不加密的,用户可以自由看到;

    ● 用户可以删除cookie,或者禁用它

    ● cookie可以被篡改

    ● cookie可以用于攻击

    ● cookie存储量很小。未来实际上要被localStorage替代,但是后者IE9兼容。

     

    express中的cookie,你肯定能想到。 res负责设置cookie, req负责识别cookie。

    cookie的使用:

     

    maxAge 过期时间

    domain:'.aaa.com' 多个二级域名共享cookie

    path 表示在哪个路由下面可以访问cookie

    httpOnly:true 设置为true,表示只有在nodejs服务端可以操作cookie ,没法用js脚本语言操作cookie

    signed属性设置成true 表示加密cookie信息

     

     

     

     

    案例:

    var express  = require('express');
    var cookieParser = require('cookie-parser');
     
    var app = express();
    //使用cookie必须要使用cookie-parser中间件
    app.use(cookieParser());
    
    app.get("/",function(req,res){
       res.send("猜你喜欢" + req.cookies.mudidi);
    });
    
    //查询一个地方的攻略,URL语法: http://127.0.0.1/gonglue?mudidi=北京
    //此时北京就能记录在cookie中
    app.get("/gonglue",function(req,res){
       //得到get请求,用户查询的目的地
       var mudidi = req.query.mudidi;
       //记录用户喜好
       //先读取用户的喜好,然后把新的数据push进入数组,然后设置新的cookie
       var mudidiarry = req.cookies.mudidi || [];
       mudidiarry.push(mudidi);
       //maxAge在Express中以毫秒为单位
       res.cookie("mudidi",mudidiarry,{maxAge: 900000, httpOnly: true});
       res.send(mudidi + "旅游攻略");
    });
    
    app.listen(3000);

    4.2 Session

    会话。 Session不是一个天生就有的技术,而是依赖cookie。

     

    session依赖cookie,当一个浏览器禁用cookie的时候,登陆效果消失; 或者用户清除了cookie,登陆也消失。

    session比cookie不一样在哪里呢? session下发的是乱码,并且服务器自己缓存一些东西,下次浏览器的请求带着乱码上来,此时与缓存进行比较,看看是谁。

    所以,一个乱码,可以对应无限大的数据。

    任何语言中,session的使用,是"机理透明"的。他是帮你设置cookie的,但是足够方便,让你感觉不到这事儿和cookie有关。

    4.3 Session的使用

     

     

    4.4、express-session的常用参数

     

     

     

    4.5、express-session 的常用方法:

     

     

    4.6、负载均衡配置 Session,把 Session 保存到数据库里面

    1.需要安装 express-session  和  connect-mongo 模块
    
    2.引入模块
    
    var session = require("express-session");
    
    const MongoStore = require('connect-mongo')(session);
    
    3.配置中间件
    app.use(session({
        secret: 'keyboard cat',    // 可以随便写。 一个 String 类型的字符串,作为服务器端生成 session 的签名
        resave: false,            /*强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。*/
        saveUninitialized: true, //强制将未初始化的 session 存储。  默认值是true  建议设置成true
        rolling:true,            //在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)
        cookie:{
            maxAge:100000       /*过期时间*/
        },
    
        store: new MongoStore({
    
            url: 'mongodb://127.0.0.1:27017/student', //数据库的地址
            touchAfter: 24 * 3600 // time period in seconds  设置touchAfter:24 * 3600,您在24小时内只更新一次会话,不管有多少请求(除了在会话数据上更改某些内容的除外)
        })
    
    
    }))

    4.7、登录案例:

    var express = require("express");
    var app = express();
    var db = require("./model/db.js");
    var session = require("express-session");
    
    app.use(session({
        secret: 'keyboard cat',
        resave: false,
        saveUninitialized: true
    }));
    
    app.set("view engine","ejs");
    
    app.get("/",function(req,res){
        if(req.session.login == "1"){
            res.send("欢迎" + req.session.username);
        }else{
            res.send("没有成功登陆");
        }
    });
    
    app.get("/login",function(req,res){
       res.render("denglu");
    });
    
    app.get("/checklogin",function(req,res){
        var tianxiedeusername = req.query.username;
        var tianxiedepassword = req.query.password;
        //根据用户填写的姓名,去数据库里面找这个文档,读取密码。
        //如果读取的密码,和填写的密码一样,登陆成功了;
        //如果读取的密码,和填写的密码不一样,登陆失败
        //如果根本没有找到这个记录,那么就说明用户名填写错了
        db.find("users",{"username":tianxiedeusername},function(err,result){
            if(result.length == 0){
                res.send("你的登录名写错了,没有这个注册用户");
                return;
            }
            var shujukuzhongdepassword = result[0].password;
            if(shujukuzhongdepassword == tianxiedepassword){
                req.session.login = "1";
                req.session.username = result[0].username;
                res.send("成功登陆!你是" + result[0].username);
            }else{
                res.send("密码错误!");
            }
        })
    });
    
    app.listen(3000);

    html页面:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <title>登陆</title>
    </head>
    <body>
       <h1>请登陆</h1>
       <form action="/checklogin" method="get">
          用户名: <input type="text" name="username" /> <br />
          密码: <input type="text" name="password" /> <br />
          <input type="submit" />
       </form>
    </body>
    </html>

     

    var session = require("express-session");
    app.use(session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true
    }))

    app.get("/",function(req,res){

    if(req.session.login == "1"){
    res.send("欢迎" + req.session.username);
    }else{
    res.send("没有成功登陆");
    }});

    app.get("/login",function(req,res){
    req.session.login = "1"; //设置这个session
    req.session.username = "考拉";
    res.send("你已经成功登陆");});

    加密使用的是MD5加密。

    1 C4CA4238A0B923820DCC509A6F75849B

    2 C81E728D9D4C2F636F067F89CC14862C

    我爱北京天安没和陈伟

    97AFBA2EE71DE6A78B61149A391A378F

    我爱北京天安没陈伟

    CCB721C1E26067BBF4BB49DFDBFA0C9E

    我爱北京天安没和陈猥:

    C3D110D2441EF9323D3F1E6082E708F8

     

    不管你加密多大的东西,哪怕10M文字,都会加密为32位的字符串,就是密码。并且神奇的,数学上能够保证,哪怕你更改1个文字,都能大变。所以MD5也能用于比对版本。

     

    MD5是数学上,不能破解的。 不能反向破解。

    也就是说,C4CA4238A0B923820DCC509A6F75849B 没有一个函数,能够翻译成为1的。

    但是,有的人做数据库,就是把1~999999所有数字都用MD5加密了,然后进行了列表,所以有破解的可能。

     

     

    作者:學長

    -------------------------------------------

    个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    Spring Boot (20) 拦截器
    Spring Boot (19) servlet、filter、listener
    Spring Boot (18) @Async异步
    Spring Boot (17) 发送邮件
    Spring Boot (16) logback和access日志
    Spring Boot (15) pom.xml设置
    Spring Boot (14) 数据源配置原理
    Spring Boot (13) druid监控
    Spring boot (12) tomcat jdbc连接池
    Spring Boot (11) mybatis 关联映射
  • 原文地址:https://www.cnblogs.com/ycx123/p/10826773.html
Copyright © 2011-2022 走看看