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