首页/文章/nextjs

如何在 Nextjs 中使用 cookies 来持久化保存用户信息

2023-07-07
15056 分钟
...

在 React/NextJS 中使用 cookies

为了在 NextJS 中使用 cookies,我们需要安装两个 packages。在本文中,我们将会使用 cookiereact-cookiereact-cookie 允许我们从客户端设置 cookie,而 cookie 则让我们能从服务器端访问设置的 cookie。运行以下命令安装 packages。

npm install react-cookie cookie 

Cookie-cutter 功能与 react-cookie 相同,但是包体积更小。

安装了上面的两个 packages 后,现在来设置一个 cookie。通常,我们会在用户成功注册或登录时设置一个 cookie。要在登录时设置一个 cookie,可以遵循下面的例子。

// pages/login.js
import { useCookies } from "react-cookie"

const Login = (

) => {
  const [setCookie] = useCookies(["user"])

  const handleSignIn = async (

) => {
    try {
      const response = await yourLoginFunction(username) //执行用以登录的 API 调用
      const data = response.data

      setCookie("user", JSON.stringify(data), {
        path: "/",
        maxAge: 3600, // cookeie 一小时后过期
        sameSite: true,
      })
    } catch (err) {
      console.log(err)
    }
  }

  return (
    <> <label htmlFor="username"> <input type="text" placeholder="enter username" /> </label> </>
  )
}

export default Login 

在上面的代码片中,我们调用了 react-cookies 包中的 setCookie 钩子并为其设置了默认值。在我们的示例中,默认值为 user。然后, 我们通过调用登录函数,发起一个请求用以用户登录。我们从 API 调用中获取 response 后,将 response.data 字符串化(cookies 应格式化为文本)并存储在 cookie 中。

我们也传递了额外的选项参数到 cookie 中,如:path,确保你的 cookie 在所有的路由中均可访问; maxAge,定义了从设置 cookie 开始到过期的时间,即 cookie 的有效期;sameSite,Samesite 指示 cookie 仅能用于设置了 cookie 的站点——将其设置为 true 非常重要,因为可以避免其在 Firefox 日志出现错误。

为了确保应用中的所有路由都能访问到 cookie,我们需要将 App 组件包装在提供 cookie 的组件内。

_app.js 文件中,添加下列代码。

// pages/_app.js
import { CookiesProvider } from "react-cookie"

export default function MyApp({ pageProps }) {
  return (
    <CookiesProvider> <Component {...pageProps} /> </CookiesProvider>
  )
} 

接下来,我们需要设置一个函数用来检查 cookie 是否存在于服务器上,(存在的话)解析 cookie 并将其作为返回值。新建一个名为 helpers 的文件夹,并在里面添加一个 index.js 文件。

在文件内,添加如下代码。

// helpers/index.js

import cookie from "cookie"

export function parseCookies(req) {
  return cookie.parse(req ? req.headers.cookie || "" : document.cookie)
} 

上面的函数接收一个 request 对象,然后检查 request 的 headers 以找到存储的 cookie。

最后,在渲染请求的路由前,我们将使用组件中的 getInitialProps 来检查用户在服务器端是否存在有效的 cookie。另外,你可以使用 getServerSideProps 作为替代。

import { parseCookies } from "../helpers/"

export default function HomePage({ data }) {
  return (
    <> <div> <h1>Homepage </h1> <p>Data from cookie: {data.user}</p> </div> </>
  )
}

HomePage.getInitialProps = async ({ req }) => {
  const data = parseCookies(req)

if (res) {
    if (Object.keys(data).length === 0 && data.constructor === Object) {
      res.writeHead(301, { Location: "/" })
      res.end()
    }
  }

  return {
    data: data && data,
  }
} 

getInitialProps 中,我们把在 NextJS 服务器端可用的 request 对象(req)传递给 parseCookies 函数。 该函数将 cookie 返回给我们,我们就可以将 cookie 作为参数发送给客户端。

我们同样会在服务器端检查 response 对象是否可用。res 对象(response)仅在服务器端可用。如果用户使用 next/linknext/router 访问到 HomePage 路由,res 对象将不可用。

通过使用 res 对象,我们可以检查是否存在 cookies 以及它们是否有效。如果 data 是空对象,则意味着 cookie 无效。如果 cookie 无效,我们将重定向用户返回至主页而不是在重定向用户前显示刷新的主页。

注意到,后续使用 next/linknext/router 以及包含 getInitialProps 的页面请求会在客户端被完成。也就是说,对于通过使用 next/linknext/router 访问的其他路由,cookie 会从客户端提取而不是服务器端。

这样,你可以在应用中存储用户的 cookies,过期无效 cookies 以及很好地保证应用的安全。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
nextjs2026-04-03
揭秘 Next.js 的图像魔法
揭秘 Next.js 的“图像魔法”:不仅仅是自动压缩 你可能以为 组件只是帮你把图片体积变小了,但实际上,它更像是一个 实时的图像处理引擎 。当你把一张高清大图扔给它时,Next.js 会在服务器端(或构建时)根据用户的设备情况,动态生成最合适的图片版本。 这背后主要依赖以下几个核心机制: 现代格式的自动转码 这是性能提升最显著的一点。你上传的可能是兼容性最好的 JPG 或 PNG,但 Next.js 会检测访问者浏览器的能力。 We...
学习
nextjs2024-12-31
Next.js App Router 项目,想加个进度条,但是怎么监听页面跳转
问题起因是我想给自己博客页面切换时加一个进度条。博客前端技术栈是 React,使用 Next 做了 SSR。在进度条方面,npm 上有非常成熟的库 。我们只需要调用 和 即可开启和结束进度条。我们监听到页面开始、结束切换的时候,调用 和 即可。但是问题是,Next 13 版本以后推出的 App Router 模式并没有给出监听路由切换的 API。 先来看看 Pages Router 模式的做法: 可以发现,在 npm 上面有一个 Nex...
学习
nextjs2024-10-09
NextJs从0-1实现一个博客系统
Nextjs 是什么 是一个基于 React 的开源框架,用于构建生产级别的 React 应用程序。它为开发人员提供了一套丰富的工具和约定,使得创建高性能、可扩展的 Web 应用程序变得更加容易。 相关代码 Next.js 的主要特性: 服务器端渲染 (SSR): 静态站点生成 (SSG): API 路由: 文件系统路由: 图像优化: TypeScript 支持: 自定义服务器: 插件系统: 安装 使用官网推荐的方式安装,执行 ,输入项...
学习
nextjs2024-09-18
Nextjs首屏加载速度性能从80分优化到98分
google控制台的网络network去看首次加载资源请求是否有重复加载的情况 google控制台的performance来录制首屏加载过程的文件时长以及阻塞情况,避免一些首次加载无须展示的组件的优化 \ 打包size优化,@next/bundle analyzer可视化的检查页面和打包的资源大小,然后针对性去优化 选择性能指标检测工具我用的 更好的了解真实用户的体验 以上是对性能可视化和测试的工具,方便针对性优化 首先对图片,css进...
学习
nextjs2024-09-14
NextJs 14 从入门到精通
node 环境 npx、yarn、bun 工具皆可(个人偏好 ,因为它快) 初始化 next 项目 项目目录 安装 autoprefixer 及配置 postcss 从 Layout 开始 app/layout.tsx 是整个应用的主布局文件,相当于React的main.ts或App.tsx,它主要做以下几个事情: 项目 metadata 加载全局样式 globals.css 加载网络/本地字体 定义应用顶级布局 国际化 i18n 第三...
学习
nextjs2024-09-10
使用NestJS开发小程序后台
前言 前一篇写NestJS的特点,使用NestJS,开启我们的Hello World! 以及NestJS各种热更新方法,本篇会写NestJS在实际项目中的应用。(ORM、参数校验、全局错误处理等等) NestJS 中使用 TypeORM 一、安装依赖 这里假设使用 MySQL 数据库,你可以根据实际情况选择其他数据库驱动。 二、配置数据库连接 1. 在项目根目录下创建一个文件 ,内容如下: 将 、 和 替换为你的实际数据库连接信息。 2...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录