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

Gorilla Session在Next.js前端返回User为Null的问题排查

问题分析

核心问题出在前端fetch请求未携带会话Cookie,导致后端Gorilla Session无法识别已登录用户。Postman会自动管理并发送Cookie,但浏览器(包括Next.js的getServerSideProps服务器端请求)默认不会在跨域请求中携带凭证。

解决方案

1. 前端Fetch请求添加凭证配置

getServerSideProps运行在服务器端,不会自动携带浏览器的Cookie,需手动从请求上下文获取并添加到请求头,同时显式开启凭证携带:

export const getServerSideProps: GetServerSideProps<{
  data: RecipeData;
}> = async (context) => {
  try {
    // 从客户端请求中获取Cookie
    const cookies = context.req.headers.cookie;
    const res = await fetch("http://localhost:4000/api/recipes", {
      credentials: 'include',
      headers: {
        Cookie: cookies || '', // 传递Cookie给后端API
      },
    });
    const data: RecipeData = await res.json();
    console.log("API Response:", data);
    return { props: { data } };
  } catch (error) {
    console.error("Error fetching data:", error);
    return { props: { data: { recipes: [], user: "" } } };
  }
};

2. 后端CORS配置补充凭证相关头

在现有CORS配置中显式允许Cookie头,确保跨域请求的凭证能正常传递:

e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
  AllowOrigins: []string{"http://localhost:3000"},
  AllowCredentials: true,
  AllowHeaders: []string{"Content-Type", "Cookie"},
  AllowMethods: []string{echo.GET, echo.POST, echo.PUT, echo.DELETE},
}))

3. 后端Session处理逻辑修复

原代码中!ok时直接返回err(此时err大概率为nil),会导致异常响应。调整为返回包含空user的正常响应:

func Home(c echo.Context) error {
    recipes, err := models.GetAllRecipes()
    if err != nil {
        return err    
    }

    sess, err := session.Get("session", c)
    if err != nil {
        return err // 仅处理Session获取失败的错误
    }
    
    sessionData, ok := sess.Values["user"]
    // 无用户数据时返回空字符串,而非终止请求
    if !ok {
        sessionData = ""
    }
    response := map[string]interface{}{
        "recipes": recipes,
        "user": sessionData,
    }

    return c.JSON(http.StatusOK, response) 
}

4. 优化Session Cookie的跨域属性

在登录接口的Session配置中补充SameSite属性,确保跨域场景下Cookie能被正常发送:

sess.Options = &sessions.Options{
    Path: "/",
    MaxAge: 86400 * 7,
    HttpOnly: true,
    SameSite: http.SameSiteLaxMode, // 开发环境用Lax,生产环境根据HTTPS情况调整
}
验证步骤
  1. 登录后,在浏览器开发者工具的Application > Cookies中确认localhost:4000下存在会话Cookie
  2. 调用/api/recipes时,查看Network > 请求头是否包含Cookie字段
  3. 后端打印sess.Values,确认是否接收到Cookie中的会话数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:04:59