Gist网站实现(2)-通过会话和session绑定登陆状态及登入登出跳转

使用会话和 session 保存登陆状态

安装包 express-session、session-file-store

1
yarn add express-session session-file-store

导入安装的模块

1
2
3
//导入session模块,需要cookie后,session需要依赖cookie
var session = require("express-session");
var FileStore = require("session-file-store")(session);

配置 session 参数

sercet: 添加此参数提高安全性

resave: 强制将会话保存回会话存储,即使在请求期间从未修改过会话也是如此。

rolling: 强制在每个响应上设置会话标识符 cookie。到期重置为原始的 maxAge,重置到期倒数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
app.use(cookieParser('SOMEd31$'));//添加secret,提高安全性
app.use(session({
secret:'SOMEd31$',
resave: true,
rolling: true,
saveUninitialized: true,
cookie:{
path:'/', //cookie路径
httpOnly:true,
secure:false,
maxAge: 60*60*1000*24 //过期时间
},
store: new FileStore({}) //采用文件来存储,否则默认为采用内存存储
}));

将 github 登陆用户数据存入 session

1
2
req.session.user = user.data;//将传回的数据存入session
res.redirect('/');//返回首页

操作 session 时,会有文件变动

在模板中访问 session

1
2
3
4
5
6
7
8
9
10
router.get('/', function(req, res, next) {
res.render('index', { title: 'AwesoLynn' , user:req.session.user });
});

//模板jade文件中添加读取的session信息
extends layout

block content
h1= title
p 欢迎来到 #{title} , #{user.login}

8sOKNq.jpg

优化登陆页面

若已登入用户访问登录页,则自动跳入首页,略过授权页面

若未登陆用户访问需登入才囊查看的页面,则自动跳入登陆页。

添加代码片段页(需登陆才能访问)

封装 gists 路由

新建 gists.js 文件,封装 gists 路由

1
2
3
4
5
6
7
8
var express = require("express");
var router = express.Router();

router.get("/", function(req, res, next) {
res.render("gists");
});

module.exports = router;//封装router模块

导入 gists 路由

在 app.js 文件导入 gists 路由

1
2
var gistsRouter = require("./routes/gists");
app.use("/gists", gistsRouter);

创建 gists 模板页

1
2
3
4
5
extends layout

block content
h1 gists
p Welcome to Gists

8sOlCV.jpg

设置 gists 页面为登陆才可访问

1
2
3
if (!req.session.user)
return res.redirect('/users/login');//若没有登陆则转入登陆页面
res.render("gists");

创建退出登陆逻辑

使用 req.session.destroy 来销毁服务器上的 session 文件。它是异步的,故可使用 async 和 await

1
2
3
4
5
6
//退出逻辑
router.get('/logout',async (req,res)=>
{
if( req.session ) await req.session.destroy();
res.redirect('/');
});

处理首页用户不存在时显示信息

原首页会显示用户信息,登出后 session 销毁,user 不存在,故需要处理 user 不存在的情况

pug/jade 文件可通过-嵌入 JS 语法

1
2
3
4
5
6
7
8
block content
h1= title
-if(user) //若已经登陆,则显示信息及退出链接
p Welcome to #{title},#{user.login}
a(href="/users/logout") Logout
-else //若没有登陆,则显示登入链接
p Welcome to #{title}
a(href="/users/login") Login

8sOM40.jpg

8sOmHs.jpg

使用中间件优化登陆访问逻辑

上述方式需要在每个登陆才能访问的页面添加逻辑判断,故使用中间件优化此通用逻辑

使用中间件,每当访问 gist 的请求,都会自动执行此中间件函数,若为未登陆状态,则转入登陆页面,否则,调用 next()进入下一个函数 gistRouter

1
2
3
4
5
6
app.use('/gists',( req , res , next )=>{
if( !req.session.user )
return res.redirect('/users/login');
else
next();
},gistsRouter);
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2024 Aweso Lynn
  • PV: UV: