You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Handlebars中访问Cookie?实现首页登录状态校验

基于Handlebars + Cookie存储JWT的首页登录状态验证方案

1. 后端解析Cookie中的JWT并传递状态到Handlebars模板

在后端(以Express为例)通过中间件读取Cookie里的JWT令牌,验证有效性后,将登录状态注入Handlebars的渲染上下文,让模板可以直接使用这些状态。

示例代码(Express + jsonwebtoken)

const jwt = require('jsonwebtoken');
const express = require('express');
const cookieParser = require('cookie-parser'); // 需先安装该依赖
const app = express();

app.use(cookieParser());

// 自定义中间件:处理JWT验证与状态传递
app.use((req, res, next) => {
  const token = req.cookies.authToken; // 假设存储JWT的Cookie名为authToken
  res.locals.isLoggedIn = false;
  res.locals.user = null;

  if (token) {
    try {
      // 验证JWT,替换为你的实际密钥
      const decoded = jwt.verify(token, 'your-jwt-secret-key');
      res.locals.isLoggedIn = true;
      res.locals.user = decoded.user; // 假设JWT payload包含用户信息
    } catch (err) {
      // 令牌无效/过期,保持未登录状态
    }
  }
  next();
});

// 渲染首页时自动带入状态
app.get('/', (req, res) => {
  res.render('home'); // Handlebars会自动读取res.locals中的变量
});

2. 在Handlebars模板中根据状态渲染差异化内容

在首页模板(如home.hbs)中,使用Handlebars的条件语法判断登录状态,展示对应内容:

示例模板代码

<!DOCTYPE html>
<html>
<head>
  <title>首页</title>
</head>
<body>
  <nav>
    {{#if isLoggedIn}}
      <span>欢迎,{{user.nickname}}!</span>
      <a href="/logout">退出登录</a>
    {{else}}
      <a href="/login">登录</a>
      <a href="/register">注册</a>
    {{/if}}
  </nav>

  <main>
    {{#if isLoggedIn}}
      <div class="user-content">
        <h2>专属内容区</h2>
        <p>只有登录用户才能看到这里的内容</p>
      </div>
    {{else}}
      <div class="guest-content">
        <h2>欢迎访问</h2>
        <p>登录后可解锁更多功能</p>
      </div>
    {{/if}}
  </main>
</body>
</html>

3. 前端辅助验证(可选)

如果需要前端做一些交互逻辑(比如发起API请求前确认令牌存在),可以在模板中嵌入少量JS读取Cookie:

<script>
// 工具函数:获取指定Cookie
function getCookie(name) {
  const cookieStr = `; ${document.cookie}`;
  const cookieParts = cookieStr.split(`; ${name}=`);
  return cookieParts.length === 2 ? cookieParts.pop().split(';').shift() : null;
}

const token = getCookie('authToken');
if (token) {
  // 前端仅做解析展示,核心验证仍需依赖后端
  const payload = JSON.parse(atob(token.split('.')[1]));
  console.log('当前用户信息:', payload.user);
} else {
  console.log('用户未登录');
}
</script>

重要提醒:前端仅能做辅助展示,所有涉及权限控制的核心逻辑必须放在后端,避免前端篡改状态绕过验证。

内容的提问来源于stack exchange,提问作者Om Thanki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:31:32