使用React路由器在React组件中导航两个ajax调用时丢失会话信息

使用React路由器在React组件中导航两个ajax调用时丢失会话信息,ajax,session,authentication,reactjs,react-router,Ajax,Session,Authentication,Reactjs,React Router,我是新来的。我想寻求你的帮助来解决我这几天遇到的问题 设计简单。我有一个运行localhost的server.js。它提供了一个POST(登录以获取身份验证)和一个GET方法(在身份验证后检索json)。登录使用基本身份验证来验证用户的电子邮件/密码。如果匹配,则返回状态200并将用户置于会话和响应中。以下是服务器端代码: 现在在客户端,我有两个js文件,一个是用于调用上面的登录名的电子邮件表单/密码,另一个是在react中使用ajax获取表单信息。导航使用React路由器。以下是一些代码:

我是新来的。我想寻求你的帮助来解决我这几天遇到的问题

设计简单。我有一个运行localhost的server.js。它提供了一个POST(登录以获取身份验证)和一个GET方法(在身份验证后检索json)。登录使用基本身份验证来验证用户的电子邮件/密码。如果匹配,则返回状态200并将用户置于会话和响应中。以下是服务器端代码:



现在在客户端,我有两个js文件,一个是用于调用上面的登录名的电子邮件表单/密码,另一个是在react中使用ajax获取表单信息。导航使用React路由器。以下是一些代码:


}


请任何人帮忙看看我错在哪里。非常感谢。顺便说一句,当我使用Postman模拟两个对服务器的调用时,只需共享更多信息。一旦我首先调用login,我还可以成功地检索表单json,除非我调用logout来清除会话中的用户。只是不知道为什么它在程序中不起作用。

您知道吗,如果您在一个请求中设置了
req.session
,它将无法用于其他请求(服务器如何知道请求来自谁)。除非您在浏览器中存储cookie。你是吗?如果没有,请看一下@DavidGilbertson,非常感谢您的回复,我认为这就是每个HTTP请求都是无状态的原因。我会把它储存在饼干里,然后试一试。我只是想知道它为什么在邮递员中有效。我也想知道它为什么在邮递员中有效:)它不应该。@DavidGilbertson,我昨天试了一下,发现了一个后续问题。我检查了网络监控,发现登录成功后发送到客户端的cookie如下:set cookie:connect.sid=xxxxxxxxxxxxx;路径=/;HttpOnly然而,当我查看第二个call请求头时,我没有看到请求中的cookie信息。正如所建议的,我应该在第二次调用的请求中使用cookie信息在服务器端进行授权。那么,我是否需要在第二次调用中显式地执行一些代码以在请求中发送cookie?所有cookie(针对您的域)都随每个请求一起发送,您无需执行任何操作。您是否知道,如果在一个请求中设置
req.session
,它将不可用于其他请求(服务器如何知道请求来自谁)。除非您在浏览器中存储cookie。你是吗?如果没有,请看一下@DavidGilbertson,非常感谢您的回复,我认为这就是每个HTTP请求都是无状态的原因。我会把它储存在饼干里,然后试一试。我只是想知道它为什么在邮递员中有效。我也想知道它为什么在邮递员中有效:)它不应该。@DavidGilbertson,我昨天试了一下,发现了一个后续问题。我检查了网络监控,发现登录成功后发送到客户端的cookie如下:set cookie:connect.sid=xxxxxxxxxxxxx;路径=/;HttpOnly然而,当我查看第二个call请求头时,我没有看到请求中的cookie信息。正如所建议的,我应该在第二次调用的请求中使用cookie信息在服务器端进行授权。所以我需要在第二次调用中显式地执行一些代码来在请求中发送cookie吗?所有cookie(针对您的域)都随每个请求一起发送,您无需执行任何操作。
//Log user in Server.js  
app.post('/session/login', function(req, res) {  
  var email = req.body.email;  
  var password = req.body.password;

  if ( null == email || email.length < 1
  || null == password || password.length < 1 ) {  
res.status(401).send("Wrong username or password");
return;
  }

  if (email == "xxxxx" && password == "xxxxx") {  
var user = new User(email, password);      
req.session.user = user;  
  return res.status(200).send({
    auth : true,
    user : user
  });
}else{  
  return res.status(401).send("Wrong username or password");
}
});
function Auth (req, res, next) {  
  if(req.session.user){  
next();
  }else{  
    console.log("Auth");  
res.status(401).send({
  flash : 'Please log in first'
    });
  }
}


app.get('/form/FormFields', Auth, function(req, res) {  
  fs.readFile(FORMFIELDS_FILE, function(err, data) {  
  if (err) {
console.error(err);
process.exit(1);
  }  
  res.json(JSON.parse(data));
  });
});
// login.js
var LoginBox = React.createClass({

  getInitialState: function () {
    return {text: '', data: []};
  },
  handleLoginSubmit: function (data) {
$.ajax({
  url: "https://localhost:3000/session/login",
  dataType: 'json',
  type: 'POST',
  data: data,
  success: function(data) {
    this.setState({data: data});
  }.bind(this),
  error: function(xhr, status, err) {
    console.error(this.props.url, status, err.toString());
  }.bind(this)
    });
  },    
  render: function () {
return(
  <div className="container">
    <LoginForm data={this.state.data} onLoginSubmit={this.handleLoginSubmit} />
    <p className="tips">{this.state.text}</p>
  </div>
);
  }

});

var LoginForm = React.createClass({
  contextTypes: {
    router: React.PropTypes.object
  },  
  getInitialState: function () {
    return {data:0,tittle: 'Login Test',text:''};
  },
  handleSubmit: function (e) {
    e.preventDefault();
    var email = this.refs.email.value.trim();
    var password = this.refs.password.value.trim();
    if (!email || !password) {
      this.setState({text:"please input both username and password!"});
      return;
    }
    this.props.onLoginSubmit({email:email,password:password});
    this.setState({text:""});
    this.refs.email.value = '';
    this.refs.password.value = '';

    //Routing defined in React-Router
    const path = '/form';
    this.context.router.push(path);
  },
  render: function () {
      return (
    <form className="loginForm" onSubmit={this.handleSubmit}>
      <p>{this.state.tittle}</p>
      <input type="email" placeholder="Your username" ref="email"/>
      <input type="password" placeholder="Your password" ref="password"/>
      <input type="submit" value="Login"/>
      <p className="tips">{this.state.text}</p>
    </form>
  )
  }
});


//code piece in form.js to call server and get form info

loadFieldsFromServer: function() {
$.ajax({
  url: "https://localhost:3000/form/FormFields",
  dataType: 'json',
  cache: false,
  success: function(data) {
    this.setState({data: data});
  }.bind(this),
  error: function(xhr, status, err) {
    console.error(this.props.url, status, err.toString());
  }.bind(this)
});
  }, 
else{
console.log("Auth");
res.status(401).send({
  flash : 'Please log in first'
});