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

ern*_*tit 26 session reactjs

我对如何在React中管理用户会话有疑问,例如在MVC .NET中你只使用Session对象(例如Session["test"] = "";)来做这件事,但显然React不能这样做.

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

有没有更好的方法来管理React中的会话变量而不是localStoragecookie?

gri*_*edj 22

我创建了一个名为的 React 模块react-client-session,它使存储客户端会话数据变得非常容易。git 存储库在这里

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

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

安装后,只需在安装根组件的位置设置所需的存储类型...

import { ReactSession } from 'react-client-session';

ReactSession.setStoreType("localStorage");
Run Code Online (Sandbox Code Playgroud)

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

import { ReactSession }  from 'react-client-session';

ReactSession.set("username", "Bob");
ReactSession.get("username");  // Returns "Bob"
Run Code Online (Sandbox Code Playgroud)

  • 如果你做了这个,你应该澄清这一点。 (2认同)

gri*_*edj 18

我会避免使用组件状态,因为这可能很难管理,并且容易出现难以排除故障的问题.

您应该使用cookies或者localStorage用于持久保存用户的会话数据.另一个选择是使用一个闭包作为你cookie或你的包装localStorage.

这是一个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;
Run Code Online (Sandbox Code Playgroud)

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

import UserProfile from './UserProfile';

UserProfile.setName("Some Guy");
Run Code Online (Sandbox Code Playgroud)

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

import UserProfile from './UserProfile';

UserProfile.getName();
Run Code Online (Sandbox Code Playgroud)

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

  • @mattburns 他们可以只接受这样的答案而不给予认可吗?在我看来像是抄袭。 (6认同)
  • 如果您存储的用户数据已经在网站上可见(例如姓名、电子邮件、电话号码等),那么这是安全的。例如,我不会用它来存储信用卡号码。;) (3认同)
  • 这是一个安全的程序吗? (2认同)
  • 定义一些类而不是使用 Clojure 语法是不是一回事?优势是什么? (2认同)

小智 7

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

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

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

localStorage.setItem('session',JSON.stringify(token));
Run Code Online (Sandbox Code Playgroud)

  • 请停止为会话推荐 JWT。他们不是为了那个。阅读更多信息:http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/ (22认同)
  • 在 localStorage 中存储令牌是不安全的;localStorage 不是一个安全的存储,如果一个坏人抓住了这个令牌,他们可以代表你采取行动。 (6认同)
  • @PauloMadroñero 在这种情况下,如果正确使用,cookie 是一个更好的选择。例如,使用 cookie,您可以 a) 阻止 JS 代码读取/写入会话 cookie(认为第 3 方 .js 表现不佳),b) 将使用限制在特定域以防止劫持 (SecureSite),c) 限制使用到 https 只是为了防止不良行为者嗅探其他人。 (2认同)

Chi*_*iya 5

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

或者,我们可以利用react-web-sessioncallback ,它提供了和等选项timeout