Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 管理用户的最佳方式是什么;她在做什么?_Session_Reactjs - Fatal编程技术网

Session 管理用户的最佳方式是什么;她在做什么?

Session 管理用户的最佳方式是什么;她在做什么?,session,reactjs,Session,Reactjs,我怀疑如何在React中管理用户的会话,例如在MVC.NET中,您只需使用会话对象(例如,会话[“test”]=”;),但React显然无法做到这一点 我在读关于使用组件状态的书,我想这会将状态设置为主组件,并使用道具将此状态传递给其他组件。我还看到有人推荐使用浏览器的localStorage或cookies,但我不知道这是否是一个好主意或做法 在React中管理会话变量是否有比使用localStorage或cookies更好的方法?我会避免使用组件状态,因为这可能很难管理,并且容易出现难以解决

我怀疑如何在React中管理用户的会话,例如在MVC.NET中,您只需使用会话对象(例如,
会话[“test”]=”;
),但React显然无法做到这一点

我在读关于使用组件状态的书,我想这会将状态设置为主组件,并使用道具将此状态传递给其他组件。我还看到有人推荐使用浏览器的
localStorage
或cookies,但我不知道这是否是一个好主意或做法


在React中管理会话变量是否有比使用
localStorage
或cookies更好的方法?

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

您应该使用
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;
当用户登录时,您可以使用用户名、电子邮件地址等填充此对象

import UserProfile from './UserProfile';

UserProfile.setName("Some Guy");
然后,您可以在需要时从应用程序中的任何组件获取此数据

import UserProfile from './UserProfile';

UserProfile.getName();

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

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

jwt.sign({user}, 'secretkey', { expiresIn: '30s' }, (err, token) => {
    res.json({
      token
  });
此处的用户对象是要在会话中保留的用户数据

localStorage.setItem('session',JSON.stringify(token));
举几个例子,我们可以使用它,它具有良好的会话管理API,例如,
initSessionService
refreshFromLocalStorage
checkAuth
和许多其他。它还提供了一些高级功能,如
不可变JS


或者,我们可以利用它提供的选项,如
回调
超时

有一个名为
React client session
的React模块,它使存储客户端会话数据变得非常容易。吉特回购协议是

这是以与闭包方法类似的方式实现的,但是它也支持使用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"
    

    这是一个安全的过程吗?如果您存储的用户数据已经在网站上可见(例如姓名、电子邮件、电话号码等),那么这是安全的。例如,我不会用它来存储信用卡号为了让我理解正确,这个方法不是会话的完整实现,对吗?它仍然需要以某种方式保持。正确。如果需要持久性,可以修改UserProfile闭包以将属性存储在localStorage中。定义某个类而不是使用Clojure语法不是一回事吗?优势是什么?在本地存储中存储令牌是不安全的;localStorage不是一个安全的存储,如果一个坏的参与者获取了该令牌,他们可以代表您行事。@Far\u为什么它不安全?那么,应该在哪里保存代币呢?或者你推荐什么方法?请停止推荐JWT参加会议。他们不是为那个而生的。阅读此文了解更多信息:@PauloMadroñero在本例中,正确使用cookies是更好的选择。使用cookie,您可以,例如,a)防止JS代码读/写会话cookie(认为第三方.JS行为不好),b)限制特定域的使用以防止劫持(SecureSite),c)仅限制https的使用以防止不良参与者嗅探,其他。会话在服务器端执行。React在客户端工作,因此唯一的选择是使用本地存储来存储临时信息。