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情况调整 }
验证步骤
- 登录后,在浏览器开发者工具的Application > Cookies中确认
localhost:4000下存在会话Cookie - 调用
/api/recipes时,查看Network > 请求头是否包含Cookie字段 - 后端打印
sess.Values,确认是否接收到Cookie中的会话数据
内容的提问来源于stack exchange,提问作者vfreis09
相关产品推荐
相关产品推荐

