身份验证 session-cookie

身份验证

  HTTP是一种没有状态的协议,也就是它并不知道是谁访问。客户端用户名密码通过了身份验证,不过下次这个客户端再发送请求的时候还得验证。

Session会话支持

  会话:一种持久的网络协议,用于完成服务器和客户端之间的一些交互行为。

  一次会话可能会包含多次链接,每次连接都会被认为是会话的一次操作。HTTP 协议是无状态的,本身不支持会话,因此在没有额外手段的帮助下,前面场景中服务器不知道用户购买了什么。

    为了在无状态的HTTP协议之上实现会话,cookie诞生了。Cookie是一些存储在客户端的信息,每次连接的时候由浏览器向服务器递交,服务器也向浏览器发起存储cookie的请求。

  服务器生成一个唯一标识符并发送给客户端浏览器,浏览器将这个唯一标识符存储在 Cookie 中,以后每次再发起请求,客户端浏览器都会向服务器传送这个唯一标识符,服务器通过这个唯一标识符来识别用户。 对于开发者来说,我们无须关心浏览器端的存储,需要关注的仅仅是如何通过这个唯一标识符来识别用户。很多服务端脚本语言都有会话功能,如 PHP,把每个唯一标识符存储到文件中。

Sessioncookie交互的过程

    1、客户端用户名跟密码请求登录

    2、服务端收到请求,去数据库验证用户名与密码

    3、验证成功后,服务端种一个cookie或发一个字符到客户端,同时服务器保留一份session

    4、客户端收到 响应 以后可以把收到的字符存到cookie

    5、客户端每次向服务端请求资源的cookie会自动携带

    6、服务端收到请求,然后去验证cookie和session,如果验证成功,就说明客户端已经登录

后端保存信息给浏览器

    服务器给浏览器一个cookie:cookie-parser中间件(express脚手架已经集成)

    服务器给浏览器cookie的同时在服务器上生产session:cookie-session中间件。

    安装cookie-session中间件

      npm i cookie-seeion -S

app.js 中引入

 

// 服务器 支持session   前后端不分离

let cookieSession = require('cookie-session')

app.use(

  cookieSession({

    secret: "zz2003", //对session id 相关的cookie 进行签名

    cookie: { maxAge: 20 * 60 * 1000 },// 设置 session 的有效时间,单位毫秒

    resave: true, //重新保存:强制会话保存即使是未修改的。默认为true但是得写上

    saveUnintialized: true, // 是否保存未初始化的会话

  })

);

 

在脚手架中routes/index.js中写下:

 

/* GET home page. */

 

// get  localhost:3000

router.get('/', function(req, res, next) {

  console.log('index')  

   console.log(req.session)  // 当用户访问首页的时候,服务器会生成一个session 信息保存到客户端里面

   console.log(req.session.id)  //session 的唯一标识符 身份证,会已加密的形式在用户电脑上存一份,服务器内存也会存一份

     // 我们也可以在在sesson中存信息,只要是同一个用户session里的信息会保存到服务器

  //用户第一次访问的时候我们在session中存 一个views=1 记录用户的访问次数

  //用户不是第一次访问的时候我们让views++ 

   if(req.session.views){

     req.session.views++

   }else{

     req.session.views = 1;

   }

  //  req.session.isLogin = true

    //在页面中把views的值渲染到页面上

  //   res.render('index', { title: 'Express',views:req.session.views });

  // });

 

index.ejs中可以将view渲染到页面上,代码如下:

 

<!DOCTYPE html>

<html>

  <head>

    <title><%= title %></title>

    <link rel='stylesheet' href='/stylesheets/style.css' />

  </head>

  <body>

    <h1><%= title %></h1>

    <p>Welcome to <%= title %></p>

    <p>您的访问次数 <%= views %></p>

  </body>

</html>

在服务上执行的结果如下:

 

 

Cookie中也有值:

 

每刷新一次终端中会更新一次

 

    这种机制sessionid 也就是登录凭证是服务器 偷偷存在浏览器的,客户端不需要做什么操作!客户端在登录网站的时候,服务器偷偷存到浏览器!

posted @ 2020-07-14 20:26  割掉扁桃体  阅读(238)  评论(0)    收藏  举报