在 React 中管理用户会话的最佳方式是什么?

IT技术 session reactjs
2021-04-09 11:18:58

我对如何在 React 中管理用户会话存有疑问,例如在 MVC .NET 中,您只能使用 Session 对象(例如Session["test"] = "";)来执行此操作,但显然 React 无法执行此操作。

我正在阅读有关使用组件状态的信息,我想这会在主组件上设置状态并使用 props 将此状态传递给其他组件。我也看到有人推荐使用浏览器localStorage或 cookie,但我不知道这是否是一个好主意或实践。

有没有比localStoragecookie更好的方法来管理 React 中的会话变量

4个回答

我会避免使用组件状态,因为这可能难以管理并且容易出现难以解决的问题。

您应该使用cookieslocalStorage来持久化用户的会话数据。您还可以使用闭包作为您的cookielocalStorage数据的包装器

这是一个UserProfile包含用户名闭包的简单示例

var UserProfile = (function() {
  var full_name = "";

  var getName = function() {
    return full_name;    // Or pull this from cookie/localStorage
  };

  var setName = function(name) {
    full_name = name;     
    // Also set this in cookie/localStorage
  };

  return {
    getName: getName,
    setName: setName
  }

})();

export default UserProfile;

当用户登录时,您可以使用用户名、电子邮件地址等填充此对象。

import UserProfile from './UserProfile';

UserProfile.setName("Some Guy");

然后,您可以在需要时从应用程序中的任何组件获取此数据。

import UserProfile from './UserProfile';

UserProfile.getName();

使用闭包将使数据保持在全局命名空间之外,并使其可以从应用程序的任何位置轻松访问。

只是为了让我的理解正确,这种方法不是会话的完整实现,对吗?它仍然需要以某种方式坚持下去。
2021-05-26 11:18:58
定义一些类而不是使用 Clojure 语法是不是一回事?有什么好处?
2021-06-06 11:18:58
这是一个安全的程序吗?
2021-06-11 11:18:58
如果您正在存储已经在网站上可见的用户数据(例如姓名、电子邮件、电话号码等),这是安全的。例如,我不会使用它来存储信用卡号。;)
2021-06-17 11:18:58
@mattburns 他们可以只接受这样的答案而不给予信任吗?在我看来像是抄袭。
2021-06-20 11:18:58

这不是在 React 中管理会话的最佳方式,您可以使用 Web 令牌来加密要保存的数据,您可以使用各种可用的服务,一种流行的服务是带有 Web 令牌的JSON Web 令牌(JWT),您可以在之后注销一段时间后,如果客户端没有任何操作,在创建令牌后,您可以将其存储在本地存储中以便于访问。

jwt.sign({user}, 'secretkey', { expiresIn: '30s' }, (err, token) => {
    res.json({
      token
  });

此处的用户对象是您要保留在会话中的用户数据

localStorage.setItem('session',JSON.stringify(token));
@Far_Eggs 为什么不安全?那么应该在哪里保存令牌呢?或者你推荐什么方法?
2021-05-22 11:18:58
请停止为会话推荐 JWT。他们不是为了那个。阅读更多信息:cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions
2021-06-02 11:18:58
在 localStorage 中存储令牌是不安全的;localStorage 不是一个安全的存储,如果一个坏演员抢到了那个令牌,他们可以代表你采取行动。
2021-06-09 11:18:58
@PauloMadroñero 在这种情况下,如果使用得当,cookie 是更好的选择。例如,使用 cookie,您可以 a) 阻止 JS 代码读取/写入会话 cookie(认为 3rd 方 .js 表现不佳),b) 将使用限制到特定域以防止劫持 (SecureSite),c) 限制使用到 https 只是为了防止坏演员嗅探其他人。
2021-06-16 11:18:58

有一个名为 React 的modulereact-client-session,可以让存储客户端会话数据变得非常容易。git repo 在这里

这是以与我的其他答案中的闭包方法类似的方式实现的,但是它也支持使用 3 个不同的持久性存储的持久性。默认存储是内存(非持久)。

  1. 曲奇饼
  2. 本地存储
  3. 会话存储

安装后,只需设置您挂载根组件的所需存储类型...

import ReactSession from 'react-client-session';

ReactSession.setStoreType("localStorage");

...并从应用程序的任何位置设置/获取键值对:

import ReactSession from 'react-client-session';

ReactSession.set("username", "Bob");
ReactSession.get("username");  // Returns "Bob"

仅举几例,我们可以使用redux-react-session,它具有用于会话管理的良好 API,例如initSessionServicerefreshFromLocalStoragecheckAuth等等。它还提供了一些高级功能,例如Immutable JS.

或者,我们可以利用react-web-session提供诸如callback和 之类的选项timeout