在浏览器中使用后退键,没有触发Nodejs路由,求解

在浏览器中使用后退键,没有触发Nodejs路由,求解

exports.gets = function(req, res){

if (req.session.name && req.session.name !== '') {
    res.render('chat');
}else{
    res.redirect('/login');
}

};

exports.kill = function(req,res){ if(req.session.name && req.session.name !==’’) { req.session = null; res.clearCookie(‘chating’); res.redirect(’/login’); }else{ res.redirect(’/chats’,res.flash(‘error’,‘cannot kill’)); } }

代码如上,我希望在访问gets页面时,判断name是否存在,若存在则显示chat页面,否则跳转到login页面。 但是,当我执行了kill操作后,按下浏览器的后退按钮,仍然能访问chat页面,而debug中并没有触发gets函数~求大神帮忙。我是希望按下后退按钮后仍然能根据是否存在name而跳转。


4 回复

当你在浏览器中按下后退按钮时,浏览器会从它的缓存中加载页面,而不是重新向服务器发起请求。这就是为什么你看到的是之前的状态,而不是重新执行 gets 函数。

为了解决这个问题,你可以考虑使用前端路由或者通过添加一些额外的逻辑来强制刷新页面。

解决方案 1: 使用前端路由

前端路由可以确保每次导航都向服务器发送请求。这可以通过使用前端框架(如 React、Vue 或 Angular)实现,也可以使用简单的 JavaScript 来处理。

示例代码:

// 客户端代码(例如在 chat 页面的脚本中)
window.addEventListener('popstate', function(event) {
    // 当用户点击后退按钮时,重新检查 session
    fetch('/check-session')
        .then(response => response.json())
        .then(data => {
            if (!data.isLoggedIn) {
                window.location.href = '/login';
            }
        });
});

在你的 Node.js 路由中增加一个检查 session 的路由:

app.get('/check-session', function(req, res) {
    if (req.session.name && req.session.name !== '') {
        res.json({ isLoggedIn: true });
    } else {
        res.json({ isLoggedIn: false });
    }
});

解决方案 2: 强制刷新页面

另一种方法是在每次页面加载时都检查 session 状态,并在需要时重定向用户。

示例代码:

// 在 chat 页面的脚本中
fetch('/check-session')
    .then(response => response.json())
    .then(data => {
        if (!data.isLoggedIn) {
            window.location.href = '/login';
        }
    });

在你的 Node.js 路由中增加一个检查 session 的路由:

app.get('/check-session', function(req, res) {
    if (req.session.name && req.session.name !== '') {
        res.json({ isLoggedIn: true });
    } else {
        res.json({ isLoggedIn: false });
    }
});

总结

通过这两种方法,你可以确保每次用户访问 chat 页面时都会重新检查 session 状态,从而决定是否应该重定向到 login 页面。这样可以避免用户通过浏览器的后退按钮绕过 session 检查。


look this :


exports.gets = function(req, res){
  if (req.session.name) {
      res.render('chat');
  }else{
      res.redirect('/login');
  }
};

exports.kill = function(req,res){ if(req.session.name) { req.session.name = null; res.redirect(’/login’); }else{ res.redirect(’/chats’); } }

hope help you.


签名 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

后退不是浏览器缓存了你的页面么,不是你去请求的吧。

你遇到的问题是因为浏览器缓存导致的。当你点击后退按钮时,浏览器通常会从缓存中加载页面,而不是重新向服务器发起请求。因此,gets 路由并不会被触发,页面也没有重新渲染。

为了确保每次点击后退按钮时都能正确地触发 gets 路由并进行相应的逻辑判断,你可以采取以下几种方法:

方法一:禁用浏览器缓存

在开发环境中,可以禁用浏览器缓存来强制每次请求都从服务器获取最新的数据。你可以在 Express 中设置响应头,这样浏览器将不会缓存页面:

app.use((req, res, next) => {
    res.set({
        'Cache-Control': 'no-cache, no-store, must-revalidate',
        'Pragma': 'no-cache',
        'Expires': 0,
    });
    next();
});

方法二:使用前端重定向

另一种方法是在前端使用 JavaScript 检测用户是否按下了后退按钮,并根据需要重定向到不同的页面。

例如,在客户端 JavaScript 代码中添加如下逻辑:

<script>
window.addEventListener('popstate', function(event) {
    // 检查 session name 是否存在
    fetch('/check-session')
        .then(response => response.json())
        .then(data => {
            if (!data.name) {
                window.location.href = '/login';
            }
        });
});
</script>

然后在 Node.js 中创建一个检查会话状态的路由:

app.get('/check-session', (req, res) => {
    res.json({ name: req.session.name || '' });
});

总结

以上两种方法都可以解决你的问题。第一种方法简单且适用于开发环境,第二种方法则更加灵活,可以更好地处理复杂的业务逻辑。选择哪种方法取决于你的具体需求和应用场景。

回到顶部