当前位置: 首页 > 知识库问答 >
问题:

每次发送新请求时,我的快速会话都会被覆盖,我想知道这是否是因为我的开发环境?快速反应

童宏富
2023-03-14

编辑-我不再认为这是一个开发环境问题,因为同样的事情仍然存在于生产环境中。

首先,感谢您在这方面花费的时间-我知道这是一个常见的问题,但我已经仔细阅读了这么多的问题,并尝试应用了这么多的解决方案,但都无济于事。

总而言之,我目前有一个React前端,它正在向我的Express服务器发送带有Fetch API的请求。我想使用快速会话来保存登录的用户信息,以便会话在用户使用应用程序时使用和验证。

我有这个奇怪的问题,每次发送新请求时,我浏览器中应用程序选项卡中的cookie都会被设置为全新的内容。我可能理解错了,但我认为这应该在整个会议中保持一致,但事实似乎并非如此。这使得每次我调用新请求时,req.session完全重置,没有任何东西。

以下是我的应用程序中的一些代码:

快速server.js[快速会话和cors的设置]

app.use(cors({
  credentials: true
}))

const session = require('express-session')
// Middleware for creating sessions and session cookies.
// A session is created on every request
app.use(session({
  secret: 'tis a secret mate',
  cookie: {
    expires: 3000, // expires in 15 mins
    httpOnly: true,
    secure: false,
  },
  // Session saving options
  saveUnintialized: false, // don't save the initial session if the session object is unmodified (i.e the user did not log in)
  resave: true, // don't resave a session that hasn't been modified
  store: MongoStore.create({
    mongoUrl: process.env.MONGODB_URI_SESSIONS
  })

  }))

  app.use(function (req, res, next) {
    console.log('SESSION LOGGING MIDDLEWARE')
    console.log(req.session);
    next()
  });

app.use((req, res, next) => {
  res.header('Access-control-Allow-Origin', 'http://localhost:3000');
  res.header(
      "Access-Control-Allow-Headers",
      "Origin, X-Requested-With, Content-Type, Accept, Authorization"
  );
  res.header('Access-Control-Allow-Credentials', true);
  next();
  });

编辑-登录路径

app.post('/api/users/login', async (req, res) => {

  // pull out the body
  const body = req.body

  // pull out the username and password
  const username = body.username
  const password = body.password

  User.findByUsernamePassword(username, password)
    .then(user => {
      // if we find the user,  the users information to the session to retain all that information
      // will create a function to ensuree that the session exists to make sure that we are logged in
      req.session.user = user
      req.session.username = user.username
      req.session.save()
      console.log(req.session)
      res.send({ user: req.session.user })
    })
    .catch(error => {
      res.status(400).send()
    });
})

前端获取调用在下面的代码中,我将登录和检查会话调用粘贴到各自的endpoint。本质上,check会话调用只返回会话中的内容,而login调用应该登录用户并将用户添加到req中。一场使用者

登录后,我尝试运行检查会话,看看用户是否在会话中,但不是每次都在。我还注意到,我的应用程序选项卡中的Chrome cookie更改为其他内容。

export const login = (username, password, setUser) => {

  const obj = {
    username: username,
    password: password
  }

  const request = new Request(`${API_HOST}/api/users/login`, {
    method: "POST",
    credentials: "include",
    body: JSON.stringify(obj),
    headers: {
      "Content-Type": "application/json"
    }
  })

  // send the request
  const promise = fetch(request)
    .then(res => {
      if (res.status === 200) {
        return res.json();
      }
    })
    .then(json => {
      // if the user exists, setUser to user
      console.log("USER PRE:", json.user)
      if (json.user !== undefined) {
        console.log("USER: ", json.user)
        setUser(json.user)
        return json.user
      }
    })
    .catch(error => {
      console.log(error);
    })

  return promise
}

export const checkSession = () => {
  const url = `${API_HOST}/api/users/check-session`

  fetch(url, {
    credentials: 'include'
  })
  .then(res => {
      if (res.status === 200) {
          console.log('200')
          console.log(res.json())
      } else {
        console.log(res)
      }
  })
  // .then(json => {
  //     if (json) {
  //       setUser(json)
  //     }
  // })
  .catch(error => {
      console.log(error);
  });
}

我尝试过的事情

  • 我已经尝试改变我的cookie在服务器中的定义方式。js(安全:false | httpOnly:true)

其他可能有用的注释

  • 我正在使用React with React路由器,不确定这是否会影响内容

谢谢你的时间,我知道这是一个超长的问题。请让我知道,如果你想帮忙,我还可以提供什么帮助来澄清!

共有1个答案

白芷阳
2023-03-14

如果在不同的主机上运行后端和前端,则可能存在CORS问题。您还说您在“应用程序”选项卡中检查了cookie,但是如果您还没有尝试查看“网络”选项卡中的请求和响应cookie头,您应该检查它们以进一步诊断问题。cookie应该在身份验证请求上设置,并且应该包含在随后的请求中。

 类似资料:
  • 问题内容: 我有登录功能 此函数用于将变量保存到会话中, 但是当新请求检查用户是否登录时 然后返回总是“注销”,因为会话已更改。我使用Redis来存储会话,我认为这是Redis的错误,因为当我停止使用Redis时,可以,请帮帮我! 问题答案: 最好的处理方式是始终让Express处理它(如果可以的话)。 https://flaviocopes.com/express-sessions/(更新了会话

  • 每当我试图进入我的repo-git时,它都会同时请求

  • 本文向大家介绍快速了解Python开发环境Spyder,包括了快速了解Python开发环境Spyder的使用技巧和注意事项,需要的朋友参考一下 Spyder简介 Spyder (前身是 Pydee) 是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑、交互测试、调试等特性,支持包括 Windows、Linux 和 OS X 系统。 ● 菜单栏(Menu bar):显示可用于操纵Sp

  • 我正在使用异步套接字用C#编写一个多客户端/服务器应用程序。连接上的每个客户端发送10个项目。问题是,当快速启动大量客户机时,每个客户机发送的条目都少于10个,有时什么也不发送,服务器只记录它们的连接。

  • Web 开发中经常需要处理 HTTP 请求、重定向和会话等诸多事务,相应地,Flask 也内建了一些常见的对象如 request, session, redirect 等对它们进行处理。 请求对象 request HTTP 请求方法有 GET、POST、PUT 等,request 对象也相应地提供了支持。举个例子,假设现在我们开发一个功能:用户注册。如果 HTTP 请求方法是 POST,我们就注册

  • 本文向大家介绍Linux下快速搭建php开发环境,包括了Linux下快速搭建php开发环境的使用技巧和注意事项,需要的朋友参考一下 一、Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XAMPP可快速搭建PHP开发环境。下载链接:https://www.apachefriends