Node + Express 后台开发 —— 登录标识

这篇具有很好参考价值的文章主要介绍了Node + Express 后台开发 —— 登录标识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

登录标识

系统通常只有登录成功后才能访问,而 http 是无状态的。倘若直接请求需要登录才可访问的接口,假如后端反复查询数据库,而且每个请求还得带上用户名和密码,这都是不很好。

作为前端,我们听过 cookie(session) 和 token,他们都是登录标识,各有特色,本篇都将完整实现。

Tip:在上文(起步篇)基础上进行

cookie 和 session

express-session

express-session —— 用于 Express 中使用 session,对于前端是无感知的,因为 cookie 会自动发送给后端。

安装 express-session 包:

PS E:\pjl-back-end> npm install express-session

added 6 packages, and audited 85 packages in 9s

2 packages are looking for funding
  run `npm fund` for details

4 vulnerabilities (3 high, 1 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

代码

app.js

app.js 中注册 session,以及设置拦截器。

$ git diff app.js

+// session
+var session = require('express-session')
 var indexRouter = require('./routes/index');
 var usersRouter = require('./routes/users');
 const UserRouter = require('./routes/UserRouter')
 // 跨域代码省略...
 // 使用跨域中间件
 app.use(allowCors);

+// 注册 session 中间件
+app.use(session({
+  // sessionId 的名字。The name of the session ID cookie to set in the response
+  name: 'pjl-system',
+  // 秘钥
+  secret: 'pjl-system-demo',
+  cookie: {
+    maxAge: 1000*60, // 60秒过期
+    // true - 只有 https 才能访问 cookie
+    secure: false
+  },
+  // true - 初始就给到 cookie。例如没有登录,直接点击“获取用户列表”,也会给到 cookie
+  saveUninitialized: true,
+}))

 // 放开静态资源
 app.use(express.static(path.join(__dirname, 'public')));

+// 请求拦截器
+app.use(function(req, res, next) {
+  // 如果是登录或注销,则放行
+  if(req.url.includes('login')){
+    next()
+    // 否则还会执行
+    return
+  }
+
+  // 登录 并且 session 有效
+  if(req.session.user){
+    // 只要来请求,就更新过期时间
+    req.session.date = Date.now()
+    next()
+  }else{
+    // session 失效,返回 401,通知“请重新登录”
+    res.status(401).json({code: '-1', msg: '请重新登录'})
+  }
+});

 app.use('/', indexRouter);

Tip:更新过期时间重新设置 session,例如这里的 req.session.date = Date.now()。任意自定义属性都可以,只要标识 session 有改变即可

UserRouter.js

增加3个接口:登录注销用户列表

$ git diff routes/UserRouter.js
 var express = require('express');
 var router = express.Router();
 const UserController = require('../controllers/UserController.js')
+// 登录
+router.post('/user/login', UserController.login);
+// 注销
+router.get('/user/loginout', UserController.loginOut);
+// 用户列表
+router.get('/user/list', UserController.userList);
UserController.js

实现3个接口。登录后设置 session,注销后销毁 session。

$ git diff controllers/UserController.js

 const UserController = {
                 error: '用户名密码不匹配'
             })
         }else{
+            // 登录成功
+            /*
+            result[0] {
+                _id: new ObjectId("6441f499113fbc9501443c70"),
+                username: 'pjl',
+                password: '123456'
+            }
+            */
+            console.log('result[0]', result[0])
+            // 删除密码
+            delete result[0].password
+            // 设置 session。好比给 session 这个房子里放点东西
+            req.session.user = result[0]
             res.send({
                 code: '0',
                 error: ''
             })
         }
-    }
+    },
+    // 注销
+    loginOut: async (req, res) => {
+        req.session.destroy(() => {
+            res.send({code: 0, msg: '注销成功'})
+        })
+    },
+    // 用户列表
+    userList: async (req, res) => {
+        var result = await UserService.userList()
+        if(result.length === 0){
+            res.send({
+                code: '-1',
+                msg: '用户列表获取失败'
+            })
+            return
+        }
+
+        res.send({
+            code: '0',
+            data: {
+                rows: result,
+            },
+            msg: '用户列表获取成功'
+        })
+    },

 }
UserService.js

实现用户列表数据库的查询。

$ git diff  services/UserService.js
const UserService = {
    login: async ({username, password}) => {
        return UserModel.find({
            username,
            password
        })
    },

   +// 用户列表
   +userList: async () => {
   +    return UserModel.find()
   +}
}

校验

后端

启动后端服务,允许前端访问新增的三个接口

PS E:\pjl-back-end> npm run start

> pjl-back-end@0.0.0 start
> nodemon ./bin/www

[nodemon] 2.0.22
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node ./bin/www`
express-session deprecated undefined resave option; provide resave option app.js:30:9
数据库连接成功

Tip:笔者这里的环境需要启动数据库,以及允许跨域请求。

前端

笔者直接使用 amis-editor(amis 低代码编辑器,更多了解请看这里)花费5分钟绘制一个如下前端页面:
Tip: 在线的 amis-editor 编辑器感觉有点慢,直接下载到本地启动。笔者使用的是 chrome 109。firefox 报错(不管)

Node + Express 后台开发 —— 登录标识

测试

现在浏览器开发工具查看cookie是空的

笔者故意输错密码,点击登录,返回{"code":"-1","error":"用户名密码不匹配"}。虽然登录失败,但 cookie 也会有值(saveUninitialized: true, 的作用,如果为 false 则需要登录成功后 cookie 才有值)。

// Genaral
Request URL: http://localhost:3000/user/login
Request Method: POST
Status Code: 200 OK
Remote Address: [::1]:3000
Referrer Policy: strict-origin-when-cross-origin

// Response
{"code":"-1","error":"用户名密码不匹配"}

Node + Express 后台开发 —— 登录标识

用户列表需要登录后才能获取,现在没有登录,点击获取用户列表,返回 401。前端可以根据这个返回做路由跳转至登录页。

Node + Express 后台开发 —— 登录标识

输入正确的密码,登录成功

Node + Express 后台开发 —— 登录标识

再次点击获取用户列表,返回用户列表信息:

// Genaral
Request URL: http://localhost:3000/user/list
Request Method: GET
Status Code: 200 OK
Remote Address: [::1]:3000
Referrer Policy: strict-origin-when-cross-origin

// Response Headers
Set-Cookie: pjl-system=s%3AuMMniH85GEC5T1c5vW5BXH0mlDlt91RT.AL7IEIrnkw5mh%2FFjARknIkWziJNWSjgSe37u5LtSLek; Path=/; Expires=Tue, 25 Apr 2023 06:27:25 GMT; HttpOnly

// Request Headers
// 自动发出 cookie,容易引起安全问题
Cookie: pjl-system=s%3AuMMniH85GEC5T1c5vW5BXH0mlDlt91RT.AL7IEIrnkw5mh%2FFjARknIkWziJNWSjgSe37u5LtSLek

// Response
{"code":"0","data":{"rows":[{"_id":"6441f499113fbc9501443c70","username":"pjl","password":"123456"}]},"msg":"用户列表获取成功"}

Tip: 这里也说明 cookie 会自动发出去

而且过期时间也从 27:03 推迟到 27:25,说明只要用户操作了,session 的过期时间就会更新。比如笔者这里设置 1 分钟,只要在这个时间内不停的与后端交互,session 就不会过期。
Node + Express 后台开发 —— 登录标识

Tip:限制访问 Cookie 有 Secure 属性和 HttpOnly 属性。这里的是 HttpOnly,所以通过浏览器控制台 document.cookie 返回空。

点击注销,再次获取用户列表,则报 401。

connect-mongo

目前有个问题:登录后,能请求到用户列表,只要保存后端,服务就会重启,再次请求用户列表就报 401,因为现在 session 存在内存中,重启服务内存中的数据就清空了。

...
[nodemon] restarting due to changes...
[nodemon] starting `node ./bin/www`
express-session deprecated undefined resave option; provide resave option app.js:32:9
数据库连接成功

我们可以借助 connect-mongo 将 session 存入mongo 数据库中。

用法很简单,首先安装包,然后配置如下即可:

PS E:\pjl-back-end> npm i connect-mongo

added 7 packages, and audited 92 packages in 12s

2 packages are looking for funding
  run `npm fund` for details

4 vulnerabilities (3 high, 1 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
$ git diff app.js

 // session
 var session = require('express-session')
+// 将session 存入 mongo
+var MongoStore = require('connect-mongo')
 app.use(session({
  saveUninitialized: true,
+  store: MongoStore.create({
+    mongoUrl: 'mongodb://192.168.1.123:27017/pjl_session_db',
+    // 默认情况下,connect-mongo使用MongoDB的TTL收集功能(2.2+)让mongodb自动删除过期的会话
+    ttl: 1000 * 60
+  })
 }))

重启后端服务,进入 mongo shell 发现 pjl_session_db 数据库被自动创建:

> show dbs
admin           0.000GB
config          0.000GB
local           0.000GB
pjl_db          0.000GB
pjl_session_db  0.000GB

目前里面有一张 sessions 的空表:

> use pjl_session_db
switched to db pjl_session_db
> db.getCollectionNames()
[ "sessions" ]
> db.session.find()
>

Tip: 为方便测试,笔者将过期时间(和 ttl)设置成 10 秒。并设置 saveUninitialized:false

输入正确的用户名和密码,登录成功,保存后端让服务重启,直接点击获取用户信息,用户信息正常返回,说明session不在保存在内存中。继续不停的点击获取用户信息时,通过浏览器开发模式发现 cookie 过期时间也在不停的更新。

此刻 sessions 表中有一条数据:

> db.sessions.find()
{ "_id" : "Y0rWLhjaDSB6eDwjIcsoF91AmJDYm9mn", "expires" : ISODate("2023-04-25T08:13:52.597Z"), "session" : "{\"cookie\":{\"originalMaxAge\":10000,\"expires\":\"2023-04-25T08:13:52.597Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"user\":{\"_id\":\"6441f499113fbc9501443c70\",\"username\":\"pjl\",\"password\":\"123456\"},\"date\":1682410422595}" }
// 点击注销后执行
> db.sessions.find()
>

点击 注销 后发现 sessions 又为空了。

再次登录后,等待过期,虽然笔者设置的 ttl 是 10 秒,但是笔者在 34 秒查询还有该条数据,38 秒时清空了 —— 说明 数据库 ttl 自动清除 session 生效,但时间不一定是我们设置的。暂未深入研究。

JSON Web Token

在react 高效高质量搭建后台系统 系列 —— 登录中我们使用了 Token。

Token 使用的大致流程:输入用户名、密码,登录成功后,后端返回数据中包含 token(即后端分配给用户的一个登录标识),前端将其保存在 localStorage 中,后续前端所有的请求都将会带上这个标识(token),后端接受请求后,验证 token 是否有效,有效则放行请求,如果无效(比如 token 过期、token 伪造),则返回 401 告诉前端“会话过期,请重新登录”。

Token 是个什么东西,为什么可以用作登录标识? 请看 jsonwebtoken。

jsonwebtoken

安装 jsonwebtoken(JSON Web Tokens 的实现):

PS E:\pjl-back-end> npm i jsonwebtoken

added 10 packages, and audited 102 packages in 12s

2 packages are looking for funding
  run `npm fund` for details

4 vulnerabilities (3 high, 1 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

在 app.js 末尾添加如下代码对 jsonwebtoken 进行初步体验:

// test token
var jwt = require('jsonwebtoken')
// 秘钥。随便写
var private_key = 'pjl-system-private-key'
// 数据。例如以后的系统登录用户名数据
var payload = {
  id: 1,
  username: 'pjl'
}
// 过期时间
var expire = '10s'
var token = jwt.sign(payload, private_key, { expiresIn: expire})
console.log('token', token)
// 验证 token
var decoded = jwt.verify(token, private_key)
console.log('decoded', decoded)

// 过期后验证
setTimeout(() => {
  var decoded = jwt.verify(token, private_key)
  console.log('过期后解码decoded', decoded)
}, 11 * 1000)

启动服务,控制台输出:

[nodemon] restarting due to changes...
[nodemon] starting `node ./bin/www`
// token
token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJwamwiLCJpYXQiOjE2ODI0ODg4NzQsImV4cCI6MTY4MjQ4ODg4NH0.mk91VodC-nuUqjUwu2idqrgQDyy_sjASXSmH6g3Go3I
// decoded
decoded { id: 1, username: 'pjl', iat: 1682488874, exp: 1682488884 }
数据库连接成功
// 11秒后再次验证 token 报错
E:\pjl-back-end\node_modules\jsonwebtoken\verify.js:40
      if (err) throw err;
               ^
TokenExpiredError: jwt expired
    at E:\pjl-back-end\node_modules\jsonwebtoken\verify.js:190:21
    at getSecret (E:\pjl-back-end\node_modules\jsonwebtoken\verify.js:97:14)
    at Object.module.exports [as verify] (E:\pjl-back-end\node_modules\jsonwebtoken\verify.js:101:10)
    at Timeout._onTimeout (E:\pjl-back-end\app.js:131:21)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7) {
  expiredAt: 2023-04-26T06:01:24.000Z
}
[nodemon] app crashed - waiting for file changes before starting...

我们将 token 放入 jwt.io 能看到解码后的信息:
Node + Express 后台开发 —— 登录标识

jwt 通常是 xxx.yyy.zzz 的字符串。包含3部分:HeaderPayloadSignature(签名)。

验证时,取出 token 的 HeaderPayload,并配合秘钥生成签名,在对比 token 中的Signature,如果相同则说明验证通过。

Tip:由于验证失败时会报错,所以下文需要对 jwt 进行封装

代码

jwt.js

对 token 封装,导出生成 token 和校验 token 的方法。

// jwt.js

// test token
const jwt = require('jsonwebtoken')
// 秘钥。随便写
const private_key = 'pjl-system-private-key'

const JWT = {
    // 生成 token
    generate(payload, expire){
        return jwt.sign(payload, private_key, { expiresIn: expire})
    },
    // 验证 token
    verify(token){
        // 验证失败会报错,所以需要 try...catch
        try{
            return jwt.verify(token, private_key)
        }catch(e){
            return false
        }
    }
}

module.exports = JWT
UserController.js

登录时将 token 设置给 request 的头部,客户端将 token 保存,下次请求则再次携带 X-Token:

$ git diff controllers/UserController.js

 const UserModel = require('../models/UserModel')
+const JWT = require('../libs/jwt')
 const UserController = {
     login: async (req, res) => {
         // req.body - 例如 {"username":"pjl","password":"123456"}
 const UserController = {
+            // payload 必须是 plain object,所以不能直接写 result[0]
+            const payload = {
+                _id: result[0]._id,
+                username: result[0].username
+            }
+            let token = JWT.generate(payload, '1h')
+            res.header('X-Token', token)
             res.send({
                 code: '0',
                 error: ''
app.js

如果是 login 的请求则放行。其他请求如果没有 token 则返回 401,有 token 则校验是否有效,有效则生成新的 token。

$ git diff app.js
+var JWT = require('./libs/jwt')

 // 跨域参考:https://blog.csdn.net/gdutRex/article/details/103636581
 var allowCors = function (req, res, next) {
   res.header('Access-Control-Allow-Origin', 'http://localhost');
-  res.header('Access-Control-Allow-Headers', 'Content-Type,lang,sfopenreferer ');
+  // 增加 X-Token,否则报错:
+  res.header('Access-Control-Allow-Headers', 'Content-Type,lang,sfopenreferer,X-Token');
   res.header('Access-Control-Allow-Credentials', 'true');
-  next();
+  // 预检。参考:https://troyyang.com/2017/06/06/Express_Cors_Preflight_Request/
+  if (req.method == "OPTIONS") {
+    res.send(200);
+  }
+  else {
+    next();
+  }
 };


+app.use(function(req, res, next) {
+  // 如果是登录则放行
+  if(req.url.includes('login')){
+    next()
+    // 否则还会执行
+    return
+  }
+
+  // console.log('req.headers', req.headers)
+  // X-Token 接收的是小写 x-token
+  const token = req.headers[('X-Token').toLowerCase()]
+  const payload = JWT.verify(token)
+  console.log('token', token)
+  // // 存在 token 并校验成功则通过,否则401
+  if(token && payload){
+    const newPayload = {
+      _id: payload._id,
+      username: payload.username
+  }
+    console.log('newPayload', newPayload)
+    // 直接用 payload 浏览器控制台报错:Bad "options.expiresIn" option the payload already has an "exp" property.
+    const newToken = JWT.generate(newPayload, '10s')
+    // console.log('newToken', newToken)
+    res.header('X-Token', newToken)
+    next()
+  }else{
+    res.status(401).json({code: '-1', msg: '请重新登录'})
+  }
+});

Tip:其中笔者环境涉及跨域,通过添加 X-TokenOPTIONS 的代码用于解决如下两个问题:

// 已被 CORS 策略阻止:预检响应中的访问控制允许标头不允许请求标头字段 x 令牌
index.html#/edit/2:1 Access to XMLHttpRequest at 'http://localhost:3000/user/list' from origin 'http://localhost' has been blocked by CORS policy: Request header field x-token is not allowed by Access-Control-Allow-Headers in preflight response.
// 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态。
index.html#/edit/2:1 Access to XMLHttpRequest at 'http://localhost:3000/user/list' from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

测试

笔者仍旧在 amis-editor 中进行,首先登陆,请求返回 X-Token,给获取用户列表增加 X-Token,服务端正常接收,并设置新的 X-Token 给前端

"api": {
  "url": "http://localhost:3000/user/list",
  "method": "get",
  "headers": {
    "X-Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NDQxZjQ5OTExM2ZiYzk1MDE0NDNjNzAiLCJ1c2VybmFtZSI6InBqbCIsImlhdCI6MTY4MjQ5NDM2MCwiZXhwIjoxNjgyNDk3OTYwfQ.fuA9FiqnE15i6YEicGZVdzhzIkNpZhkPzGvWVQZ7qdY"
  }
}
// 第二次请求“用户列表”,返回新的 Token
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NDQxZjQ5OTExM2ZiYzk1MDE0NDNjNzAiLCJ1c2VybmFtZSI6InBqbCIsImlhdCI6MTY4MjQ5NTUwNiwiZXhwIjoxNjgyNDk1NTE2fQ.mtg9l9-hh33HHFX8PwKRrerUs61JxHbdRY3jwLTZVbI

Session Vs Token

session 的流程:用户登录,session 在服务端生成一个房间(房间放在数据库中),并在房间中放点东西,接着把房间钥匙(即 session Id)设置回 cookie,后续客户端的所有请求都会自动带上这个 cookie(钥匙),服务端则会根据钥匙去找房间,能找到房间则请求通过,否则告诉前端重新登录

token 的流程:用户登录,服务器生成 token 并返回,前端将 token 存入 localStorage,后续所有请求手动将 token 传回服务端,服务端通过秘钥验证 token,验证成功则请求通过,否则告诉前端重新登录

Session 特点

  • 上文通过 express-session 实现登录授权,对前端来说是无感知的
  • cookie 会随着 http 自动发送,容易引起安全问题
  • Session 存在数据库,如果用户数过多,服务端开销就会大
  • 后端如果有集群,可能就得涉及多个 session 之间的同步。如果将多个 session 数据库提取出一个公共服务,存在一个机器中,假如该服务宕机,所有用户得重新登录

Token 特点

  • 占带宽,每次请求都带上 Token
  • token 不会自动发送,得手动发送
  • 无法在服务端注销(可配合服务端实现注销 token)

登录标识 vs 权限

本篇的 token 和 session 仅仅是登录标识,而非权限,笔者之前写过 前端权限,而前端权限是不靠谱的,所以后端权限通常更重要。

比如直接通过发送一个请求给后端,后端就得查询这个用户(token、cookie都可以获取用户名等信息)的角色、权限,所以每个请求过来,都需要查询数据库。

Tip:更多请自行查阅 RABC 权限文章来源地址https://www.toymoban.com/news/detail-434358.html

到了这里,关于Node + Express 后台开发 —— 登录标识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • node+vue+express开发环境下接口数据传递中的跨域问题

    大部分浏览器自带的保护措施,限制用户在一个域名下请求另一个域名的数据 跨域对于前后端开发者来说,就像一块狗皮膏药,无论是面试还是开发中,都会经常遇到。 之所以出现跨域问题,是因为浏览器的同源策略,为了隔离潜在的恶意文件,为了防御来自歪门邪道的攻

    2024年02月19日
    浏览(39)
  • python web 开发与 Node.js + Express 创建web服务器入门

    目录 1. Node.js + Express 框架简介 2  Node.js + Express 和 Python 创建web服务器的对比 3 使用 Node.js + Express 创建web服务器示例 3.1 Node.js + Express 下载安装 3.2 使用Node.js + Express 创建 web服务器流程         Node.js + Express 是一种常用于构建 Web 应用程序的开发堆栈,其中 Node.js 是运行

    2024年02月10日
    浏览(63)
  • Node.js基本概念、特点、用途和常用模块,以及Express框架开发一个web应用

    目录 一、Node.js的基本概念和特点 二、Node.js的用途 三、Node.js的常用模块 四、使用Node.js进行Web开发 1. 安装Node.js 2. PyCharm配置Node.js 3. 使用http库编写一个web服务 4. 使用Express框架构建Web应用程序 5. 调试代码 6. 发布应用程序 参考文章  Node.js系列文章推荐阅读: JavaScript匿名函

    2024年02月07日
    浏览(89)
  • Node.js毕业设计基于BS的机场安全监督系统(Express+附源码)

    本系统 (程序+源码) 带文档lw万字以上    文末可 获取 本课题的 源码和程序 选题背景: 在现代航空运输业的高速发展下,机场作为航空运输的重要节点,其安全运营至关重要。随着航班数量的增加和旅客流量的上升,机场安全管理的复杂性和难度也在不断提高。传统的机

    2024年04月23日
    浏览(29)
  • 【Node.js实战】一文带你开发博客项目之Express重构(博客的增删查改、morgan写日志)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力n年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2Vue3项目实战 🥝

    2024年02月06日
    浏览(66)
  • 作为前端leader,如何搭建属于我们公司自己的流水线自动化部署系统(node+express)

    背景:自动化部署系统主要可以集成到公司内部的管理系统中去,比如公司有多个项目,移动端H5,大屏网站,门户网站等...每次发布或者迭代都需要前端同事打包然后在交给运维或者后端同事放到服务器上进行部署 ,如果有一个项目多个同事合作完成 还要走git合并流程,

    2024年02月19日
    浏览(52)
  • Django的后台认证登录系统,登录多久之后失效呢

    Django的后台认证登录系统的会话失效时间可以通过 SESSION_COOKIE_AGE 设置来控制,默认值是1209600秒(即两周)。如果你没有对这个设置进行更改,那么用户在登录后两周内如果没有再次登录,会话就会失效。 如果你想更改这个默认的会话失效时间,可以在你的Django项目的 sett

    2024年01月20日
    浏览(44)
  • 基于Node.js的后台管理系统的数据表格导出下载

    今天在工作的时候接触到一个需求,就是现在有一个简单的后台管理系统是基于node.js来实现的,现在需要将其中的一个表格数据下载下来。乍一听还以为这个是一个简单的需求,以为只要简单的一个小时就能完成,没有想到直接花了我将近两个半小时并且还是在他人的帮助下

    2024年02月13日
    浏览(57)
  • 实战渗透--一次对后台登录系统的简单渗透测试

    某网站后台登录界面 发现有验证码框 猜想会不会存在验证码绕过的漏洞 首先随意输入用户名密码(用于抓包) 打开burp抓包 分析数据包后 找到对应的传参点 即输入的账号密码还有验证码 这里可以看到 账号和密码全都是明文传输 并没有进行加密 所以更改起来还是很容易的

    2024年02月02日
    浏览(49)
  • UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

            所有的操作系统都为运行在其上的程序提供服务,比如:执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等         从严格意义上来说,操作系统可被定义为一种软件,它控制计算机硬件资源,提供程序运行的环境。我们通常将这种软件称为

    2024年02月13日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包