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

Next13+Prisma登录场景:如何导出Server Component内的Ldata对象?

解决Next.js 13中登录后用户信息跨页面共享的问题

你的核心问题是登录验证后的用户信息Ldata无法直接跨页面复用,因为表单action函数Logged依赖FormData且执行后会跳转。可以通过会话Cookie存储+跨页面读取的方式解决,具体步骤如下:

1. 登录成功后将用户信息存入Cookie

在Logged函数中,当验证通过(Ldata存在)时,把用户的核心标识信息存入HTTP Cookie。Next.js 13的App Router中可以直接使用next/headers提供的cookies工具操作:

import { redirect } from 'next/navigation';
import { cookies } from 'next/headers';
import prisma from '@/lib/prisma'; // 替换为你的Prisma客户端实际路径

export async function Logged(fdata: FormData) {
  const datnama = fdata.get("Username")?.toString();
  const datpassword = Number(fdata.get("password"));
  
  const Ldata = await prisma.user.findFirst({
    where: {
      nama: datnama,
      NISN: datpassword
    },
    select: {
      nama: true,
      NISN: true
    }
  })

  if (Ldata) {
    // 将用户非敏感信息存入Cookie
    cookies().set({
      name: 'user_session',
      value: JSON.stringify({ nama: Ldata.nama, NISN: Ldata.NISN }),
      httpOnly: true, // 禁止前端JS读取,提升安全性
      secure: process.env.NODE_ENV === 'production', // 生产环境强制HTTPS传输
      path: '/', // 全站页面可访问该Cookie
      maxAge: 86400 // 有效期1天(单位:秒)
    });
    redirect('/');
  } else {
    redirect('/Login/Loginerror');
  }
}

2. 在其他页面读取用户信息

服务器组件中读取

App Router默认页面都是服务器组件,可直接用cookies工具读取并验证:

import { cookies } from 'next/headers';
import prisma from '@/lib/prisma';

export default async function Home() {
  const sessionCookie = cookies().get('user_session')?.value;
  let userInfo = null;

  if (sessionCookie) {
    const parsedSession = JSON.parse(sessionCookie);
    // 安全起见,用Cookie中的标识重新查询数据库(避免Cookie被篡改)
    userInfo = await prisma.user.findFirst({
      where: {
        nama: parsedSession.nama,
        NISN: parsedSession.NISN
      },
      select: { nama: true, NISN: true }
    });
  }

  return (
    <div>
      {userInfo ? <p>欢迎回来,{userInfo.nama}</p> : <p>请先登录</p>}
    </div>
  );
}

客户端组件中读取

如果是客户端组件,可通过next/navigation的useCookies钩子读取:

'use client';
import { useCookies } from 'next/navigation';

export default function ClientPage() {
  const cookies = useCookies();
  const sessionCookie = cookies.get('user_session');
  let userInfo = null;

  if (sessionCookie) {
    userInfo = JSON.parse(sessionCookie);
  }

  return <div>{userInfo ? `当前用户:${userInfo.nama}` : '未登录状态'}</div>;
}

额外注意事项

  • 绝对不要在Cookie中存储敏感信息(如密码),仅保留用户唯一标识即可,通过标识二次查询数据库能避免Cookie篡改带来的安全风险。
  • 若需要更完善的身份认证流程,可直接使用NextAuth.js,它内置了会话管理、OAuth第三方登录等成熟功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:42:48