Nodejs 求在ejs页面里面如何循环判断session的状态

Nodejs 求在ejs页面里面如何循环判断session的状态

如题,我现在想在页面里面来判断session的状态,以便确定是否是过期的,这样我就能够进行提示,比如登陆或者注册什么的,但是我不想到后台去进行判断或者请求,这样肯定是不行的,我尝试着在ejs的<%%>代码块里面使用计时器,发现没有起到作用。 求,怎样在客户端循环判断session状态

3 回复

要在EJS页面中循环判断Session的状态,并根据状态显示相应的提示信息(例如登录或注册),可以通过以下步骤实现。这里假设你已经在服务器端正确设置了Session,并且已经将Session传递到前端。

示例代码

后端代码(Express.js)

首先,确保你已经在后端正确配置了Session中间件:

const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true
}));

app.get('/', (req, res) => {
    res.render('index', { session: req.session });
});

app.listen(3000, () => console.log('Server running on port 3000'));

EJS模板

在EJS模板中,你可以通过JavaScript来检查Session的状态,并使用定时器来定期更新页面内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Session Status Check</title>
    <script>
        // 定义一个函数来检查session状态
        function checkSessionStatus() {
            // 获取当前session状态
            let isLoggedIn = <%= JSON.stringify(session.isLoggedIn) %>;
            
            // 根据session状态显示不同的内容
            if (isLoggedIn) {
                document.getElementById('status').innerText = "已登录";
            } else {
                document.getElementById('status').innerText = "未登录,请登录或注册";
            }
        }

        // 初始加载时检查一次
        window.onload = checkSessionStatus;

        // 每5秒检查一次
        setInterval(checkSessionStatus, 5000);
    </script>
</head>
<body>
    <h1>Session 状态检测</h1>
    <div id="status"></div>
</body>
</html>

解释

  1. 后端代码

    • 使用express-session中间件来管理Session。
    • 在根路由/中渲染EJS模板,并将Session对象传递给模板。
  2. EJS模板

    • 在页面加载时和之后每隔5秒调用checkSessionStatus函数。
    • checkSessionStatus函数从服务器传递的Session数据中获取isLoggedIn状态,并根据该状态更新页面上的文本。
    • 使用<%= JSON.stringify(session.isLoggedIn) %>将服务器端的Session数据传递到客户端JavaScript。

这种方法避免了频繁向服务器发送请求,而是通过定期检查本地Session状态来实现所需功能。


页面上可以用ajax向后台要session的状况。

要在EJS页面中循环判断session状态,并且不通过后台请求来实现这一功能,可以通过客户端JavaScript定时检查一个全局变量或通过某种机制(例如在HTML中嵌入一个标识)来完成。这种方式需要确保session状态可以在客户端被访问到,这通常意味着你需要将session信息的一部分传递给前端,然后在前端进行状态检查。

以下是一种可能的方法:

  1. 在服务器端将session信息传递给EJS模板:在渲染EJS模板之前,你可以将session信息(如有效期、用户ID等)嵌入到页面中,例如作为隐藏的<input>标签或通过JavaScript全局变量。
// 假设这是你的Express路由处理函数
app.get('/', (req, res) => {
    // 将session信息传递给EJS模板
    res.render('index', { sessionInfo: req.session });
});
  1. 在EJS模板中定义全局变量并添加定时器:在EJS模板中,你可以使用<script>标签来定义全局变量,并设置定时器来检查该变量的状态。
<!-- index.ejs -->
<!DOCTYPE html>
<html>
<head>
    <title>Session Check Example</title>
</head>
<body>
    <!-- 其他页面内容 -->

    <script>
        // 假设这里直接将session信息作为JSON字符串传递给了前端
        const sessionInfo = <%- JSON.stringify(sessionInfo) %>;

        function checkSession() {
            if (sessionInfo.expired) {
                alert("您的会话已过期,请重新登录!");
                // 重定向到登录页或其他操作
            } else {
                console.log("Session is still valid.");
            }
        }

        // 每5秒检查一次session状态
        setInterval(checkSession, 5000);
    </script>
</body>
</html>

注意:

  • 这里假设sessionInfo对象中包含了一个expired属性来表示session是否已经过期。你需要根据实际的session结构来调整这部分代码。
  • 这种方法的一个缺点是,它依赖于客户端的JavaScript来管理session状态,这可能不是最安全的选择,因为敏感信息应该始终在服务端处理。如果可能的话,建议还是通过服务端请求来验证session状态。
回到顶部