Express+Nodejs 下的登陸攔截實現前端
利用商城舉例,在商城中沒有登陸以前,能夠看商品列表、詳情、登陸或者註冊均可以,可是購買的時候是不行的,那麼這個功能在Node後臺中是怎麼實現的呢,這個功能能夠由前端去在前臺實現,可是不安全,本文今天講解,Node 的全局攔截的實現。node
在node項目中,打開 app.js ,咱們能夠看到數據庫
// catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); });
咱們能夠看到,監聽了全局的 404 錯誤,那麼咱們能夠借鑑這個方法去全局監聽 登陸這個功能,實現全局的攔截。express
在全部的路由前邊,添加全局攔截json
// 設置全局攔截 app.use((req, res, next) => { if(req.cookies.userId){ // userId 存在,也就是登陸了,那就不攔截繼續執行 next(); }else{ /** * userId 不存在,也就是沒有登陸了 * 這個時候 讓不登陸的接口 能繼續調用,其餘的一切接口所有禁用,這樣就實現了,沒有登陸什麼都調用不了 * req.originalUrl 當前接口地址 * goods 做介紹,查詢商品的時候,後邊會與不少的參數,第幾頁多少數據排序等等這個時候,req.originalUrl 就不行了,這個獲取不到後邊的參數 * 有兩種方法 * 一、req.originalUrl.indexOf('/goods') > -1 * 二、獲取不帶參數的 url 地址 req.path */ // if(req.originalUrl == '/users/login' || req.originalUrl == '/users/loginOut' || req.originalUrl.indexOf('/goods/list') > -1 ){ if(req.originalUrl == '/users/login' || req.originalUrl == '/users/loginOut' || req.path == '/goods/list' ){ next(); }else{ res.json({ status: '101', msg: "當前未登陸", result:'' }); } } });
在這裏使用的都是後臺的 cookie 存儲,能夠使用後臺的 session 。安全
Node 的登陸接口代碼cookie
/** * login * 以及路由是 users 這裏路徑就不寫 users 了 */ router.post('/login', function(req, res, next) { var param = { userName: req.body.userName, userPwd: req.body.userPwd }; // 經過 mongoose 查找修改數據庫 User.findOne(param, (err, doc) => { if(err){ res.json({ status: "1", msg: err.message }); }else{ // 接口調用成功 if(doc){ // 保存到 cookie res.cookie("userId", doc.userId, { path: '/', maxAge: 1000*60*60 }); res.cookie("userName", doc.userName, { path: '/', maxAge: 1000*60*60 }); // 保存 session,先要安裝 express-session插件 // req.session.user = doc; res.json({ status: "0", msg: "", result: { userName: doc.userName } }); } } }); });