登录验证原理的实现

    1. 访问 “ / ” 路由时候,渲染index.ejs页面
var express = require('express');
var app = express();

/*设置使用静态页面*/
app.set('view engine','ejs');

/*渲染静态页面*/
app.get('/',function (req, res) {
    res.render('index.ejs');
});

/*如果在express中使用对应的socket,不能使用app监听,要用http监听*/
 app.listen(3000);

    1. 当点击进入聊天室后(提交表单的时候,提交到'/check'路由上),即访问'/check'路由时,先获取用户名,然后判断用户名是否有数值;若有数值,则判断用户名是否重复;若不重复,则将该用户名保存在数组中,并将用户名保存在session中。然后跳转到chat路由上。
  • 路由的跳转使用redirect方法

    • redirect:第一个参数表示对应的状态码,只有301和302,其余都不行

    • 第二个参数表示我们跳转到的界面的路由

    • 一般情况我们不写状态码

res.redirect('/chat');
/*判断用户名是否重复
 * 解决的办法:
 * 设置一个数组,用来记录所有输入的用户名,然后获取到当前的用户名和对应的数组中的数组进行比较,如果数组中没有这个用户名,表示不重复,就添加到数组中。要是重复,就回到首页*/
/*设置一个数组,用来记录对应的用户名
 * 设置数组不能设置到路由的回调中,需要设置在外面*/
var names = [];

/*
 首页、验证信息、登录界面
 设置处理check路由,用来处理对应的用户昵称的业务逻辑
 分析用户名的逻辑
 保证对应的哟用户名有数值
 当有数值之后,判断用户名是否重复
 当都符合后,就进入登录页面,不符合就回到首页
 * */
app.get('/check',function (req, res) {
    /*获取用户名*/
    var userName = req.query.userName;

    /*判断用户名是否存在*/
    if (!userName){
        //用户名没有数值,即不存在
        res.send('用户名不存在,请输入用户名');
        return;
    }else {
        //用户名存在,判断用户名是否重复
        /*检测用户名是否存在数组中
         * 解决方法:使用数组中的indexOf方法
         * indexOf:表示对应的元素是否存在数组中,如果返回-1,则表示不存在,即不重复。不等于-1则表示存在,即重复*/
        if (names.indexOf(userName) == -1){
            //用户名不存在,即不重复。
            /*不重复时,则先将对应的用户名保存在数组中,然后跳转到聊天页面。*/
            names.push(userName);

            /*我们需要在其他地方使用用户名,因此我们需要使用session保存用户名*/
            req.session.userName = userName;

            /*当符合后,我们跳转到聊天页面*/
            /*redirect:第一个参数表示对应的状态码,只有301和302,其余都不行
            * 第二个参数表示我们跳转到的界面的路由
            * 一般情况我们不写状态码*/
            res.redirect('/chat');
        }else{
            /*重复*/
            res.send('用户名已经存在,请重新输入');
            return;
        }
    }
});

    1. 当访问 ‘/chat’ 路由的时候,客户端获取input中的数据,然后将用户输入的数据与用户名一起作为msg发送给服务端,服务端接受到客户端信息,再将其发送给对应的客户端,显示在界面上。
  • 这里需要用到websocket,因此需要导包
var session = require('express-session');
/*设置使用session*/
app.use(session({
    secret: 'keyboard cat',//相当于是密文
    resave: false,//是否重新设置cookie
    saveUninitialized: true,//表示是否每次session都需要重新设置
    cookie: { maxAge: 90000 }//session依赖的cookie
}));
  • 在express中websocket是固定的步骤
 */
/*第一种写法*/
/* 0. 导包*/
   // var io = require('socket.io');
 /* 1. 使用app创建对应的http服务端*/
   // var http = require('http').Server(app);
/* 2. 使用http服务端创建对应的socket*/
   // var socket = io(http);

/*第二种写法*/
var http = require('http').Server(app);
var socket = require('socket.io')(http);
  • 在ejs中存在其他静态资源的请求,因此需要设置使用静态资源
/*设置使用静态资源*/
app.use(express.static('./public'));
  • 在设置路由用来聊天的页面上,我们在渲染页面前需要进行对应的用户名的验证。

  • 判断用户名是否存在对应的session中,如果不存在,重新跳转到登录页面。如果存在,继续处理后续的业务

/*设置路由用来聊天页面*/
app.get('/chat',function (req, res) {
    /*渲染页面前我们进行对应的用户名的验证
    * 判断用户名是否存在对应的session中,如果不存在,重新跳转到登录页面。如果存在,继续处理后续的业务*/
    if(!req.session.userName){
        //用户名不存在,跳转到首页
        res.redirect('/');
        return;
    }
    //用户名存在,渲染页面
    res.render('chat.ejs',{'userName':req.session.userName});
});
  • 客户端发送数据给服务端

  • 先点击对应的回车键的时候,我们获取对应的input中的数据,然后把对应的数据发送给服务器

  • 在发送数据前必须先设置socket

/*0. 设置socket*/
var socket = io();

/*1. input触发对应的事件,然后发送信息*/
$('#content').on('keydown',function (e) {
    /*判断点击的是否是回车键*/
    if (e.keyCode == 13){

       /*获取每一个用户的名字*/
        var perName = $('#userName').html();

        /*获取input中的内容*/
        var content = $('#content').val();

        /*获取数据,发送给服务器*/
        socket.emit('chat',{
            perName:perName,
            content:content
        });
        
        /*清空表单中的数据*/
        $('#content').val(" ");
    }
});

  • 服务器接受客户端的信息,然后再把信息发送给客户端
*处理具体聊天逻辑
* 当用户点击回车时候,把对应的input中信息获取到然后发送到服务器端,当服务器接收到信息后,
* 再把数据返回给客户端
* 分析服务器:接收到连接后,然后接收客户端发送过来的信息
* 接收到后,再返回对应的数据
* 服务器必须先接收连接,再接收信息*/
socket.on('connection',function (socket) {
    socket.on('chat',function (msg) {
        console.log(msg);

        /*msg表示接受到的信息*/
        /*再把对应的信息发送给对应的客户端*/
        socket.emit('reply',msg);
        console.log('发送成功');
    })
});

  • 客户端接收信息,添加到对应的记录上。
/*2.当接收到信息后,我们把对应的信息作为记录添加到页面中*/
/*在界面中添加对应的记录,就是在ul中添加li标签,使对应的信息跑到最前面,使用prepend
* 我们需要在li中设置用户名和对应的内容
* 而且设置用户名为加粗*/

socket.on('reply',function (msg) {
    console.log('接受成功');
    $('.oList').prepend('<li><b>'+msg.perName+':</b>'+msg.content+'</li>');
})
  • 如果在express中使用对应的socket,不能使用app监听,要用http监听
http.listen(3000);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容