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

NextJs 13+JWT验证中间件:重定向过多及登录访问限制问题

解决Next.js 13 JWT验证的重定向循环与页面访问控制问题

问题现象

  • 已登录用户仍可直接访问/login或/register页面
  • 访问上述页面时出现「localhost redirected you too many times」重定向循环错误

问题根源

  1. 原matcher包含首页/,导致重定向到首页后会再次触发中间件,增加不必要的检查逻辑
  2. 当JWT无效时,访问登录页会触发重复重定向到登录页的循环(验证失败后直接重定向到/login,而该页面又会被中间件拦截)
  3. 逻辑分支未覆盖JWT验证失败后允许用户停留在登录页的场景

修改后的middleware.js代码

import { NextResponse } from "next/server";
import { verify } from "jsonwebtoken";

export function middleware(request) {
  const secret = process.env.JWT_SECRET;
  const jwt = request.cookies.get("jwt")?.value;
  const path = request.nextUrl.pathname;

  // 未登录用户访问需要权限的页面,重定向到登录页
  if (!jwt && path.startsWith("/dashboard")) {
    return NextResponse.redirect(new URL("/login", request.url));
  }

  // 已登录(JWT有效)用户访问登录/注册页,重定向到首页
  if (jwt && (path === "/login" || path === "/register")) {
    try {
      verify(jwt, secret);
      return NextResponse.redirect(new URL("/", request.url));
    } catch (error) {
      // JWT无效时,清除无效Cookie并允许访问登录页
      const response = NextResponse.next();
      response.cookies.delete("jwt");
      return response;
    }
  }

  // 其他情况(如访问首页、JWT有效时访问权限页面)直接放行
  return NextResponse.next();
}

export const config = {
  // 只拦截需要控制的页面,去掉首页/避免不必要的中间件触发
  matcher: ["/dashboard/:path*", "/login", "/register"],
};

关键修改说明

  • 调整匹配规则:移除/,仅对需要权限校验的/dashboard系列页面和登录注册页触发中间件,减少不必要的逻辑执行
  • 处理无效JWT:当JWT验证失败时,清除无效的Cookie并允许用户留在登录页,避免重定向循环
  • 简化逻辑分支:拆分未登录权限拦截和已登录页面跳转的逻辑,让代码更清晰,避免分支覆盖不全的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:35:11