登录成功后点击Vip按钮后看不到Vip页面

登录成功后点击Vip按钮后看不到Vip页面

尝试过的解决方式:

我试了一下,发现登录成功后再请求http://www.dell-lee.com/react/api/isLogin.json判断login登录状态也是false,正常应该是true。问题应该是出在这里,原因是因为新版谷歌浏览器记不住登录状态吗?


login下的index.js相关代码:

import React, { Component } from "react";
import { Link, withRouter } from 'react-router-dom';
import axios from 'axios';
import { Modal, Button, Input, message } from 'antd';
import "./style.css";


class Login extends Component {

constructor(props) {
super(props);
this.state = {
login: false,
modal: false,
user: '',
password: ''

};
// 强制绑定this
this.showModal = this.showModal.bind(this);
this.hideModal = this.hideModal.bind(this);
this.changePassword = this.changePassword.bind(this);
this.changeUser = this.changeUser.bind(this);
this.checkLogin = this.checkLogin.bind(this);
this.logout = this.logout.bind(this);
}
showModal() {
this.setState({
modal: true
})
}
checkLogin() {
// 获取用户名以及密码,通过地址栏上携带的方式发送给服务器
const { user, password } = this.state;
const url = `http://www.dell-lee.com/react/api/login.json?user=${user}&password=${password}`;
axios.get(url, { withCredentials: true }).then(res => {
const login = res.data.data.login;
console.log("点击OK后登录成功", login);
// 服务器做出判断后返回数据,然后提示用户是否登录成功
if (login) {
message.success('登陆成功');
this.setState({
login: true,
modal: false,
})
} else {
message.error('登录失败');
}
}).then(res => {
axios.get('http://www.dell-lee.com/react/api/isLogin.json', {
withCredentials: true
})
.then(res => {
const login = res.data.data.login;
console.log("请求http://www.dell-lee.com/react/api/isLogin.json判断login登录状态:",login)
})
})
}
hideModal() {
this.setState({
modal: false
})
}
changeUser(e) {
// 用户名输入框输入后改变user数据,react改变数据后会自动重新渲染在页面上
this.setState({
user: e.target.value
})
}
changePassword(e) {
// 密码输入框输入后改变password数据,react改变数据后会自动重新渲染在页面上
this.setState({
password: e.target.value
})
}
logout() {
axios.get('http://www.dell-lee.com/react/api/logout.json', {
withCredentials: true
})
.then(res => {
const data = res.data.data;
if (data.logout) {
this.setState({
login: false
});
}
// this.props.history.push('/');
})
}
render() {
const { login } = this.state;
return (
// 如果在已经登录则显示退出按钮,未登录则显示登录按钮
<div className="login">
{login ?
<Button type="primary" onClick={this.logout}>退出</Button> :
<Button type="primary" onClick={this.showModal}>登录</Button>
}
<Link to='/vip'>
<Button
type="primary"
style={{ marginLeft: 10 }}
>
Vip
</Button>
</Link>
<Modal
title="登陆"
visible={this.state.modal}
onOk={this.checkLogin}
onCancel={this.hideModal}
>
<Input
placeholder='请输入用户名'
style={{ marginBottom: 10 }}
value={this.state.user}
onChange={this.changeUser}
/>
<Input
placeholder='请输入密码'
type='password'
value={this.state.password}
onChange={this.changePassword}
/>
</Modal>
</div>
)
}
componentDidMount() {
axios.get('http://www.dell-lee.com/react/api/isLogin.json', {
withCredentials: true
})
.then(res => {
const login = res.data.data.login;
this.setState({ login })
})
}
}


export default Login;

vip下的index.js相关代码:

import React, { Component } from "react";
import { Redirect } from 'react-router-dom';
import axios from 'axios';
import "./style.css";

class Vip extends Component{
constructor(props) {
super(props);
this.state = {
login: true,
fetchFinish: false
}
}

render() {
if (this.state.login) {
if (this.state.fetchFinish) {
return <div className='vip'>Vip</div>
}else {
return <div className='vip'>正在判断用户登陆状态...</div>
}
}else {
return <Redirect to='/' />
}
}
componentDidMount() {
axios.get('http://www.dell-lee.com/react/api/isLogin.json', {
withCredentials: true
})
.then(res => {
const login = res.data.data.login;
console.log("点击Vip按钮,再次请求http://www.dell-lee.com/react/api/isLogin.json判断login登录状态:",login);
this.setState({
login,
fetchFinish: true
})
})
}
}

export default Vip;

相关截图:

http://img1.sycdn.imooc.com//climg/612ddd3c09f89c9f00000000.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,老师检查了一下代码,代码没有问题,应该是浏览器的问题,建议同学换成火狐浏览器试试。如果火狐浏览器也不行,可以参考如下,设置一下谷歌浏览器,看能不能解决问题:

找到桌面上的谷歌快捷方式,右键“属性”,在弹出的窗口中,找到目标:

60d68f6b099041aa06140578.jpg (614×578)

在目标中的内容后面,拼接上如下内容(拼接的内容与“目标”中原内容之间,要敲几个空格):

--flag-switches-begin --disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure --flag-switches-end

效果图:

60d68fbd09796de703390084.jpg (339×84)

设置好后,重启谷歌浏览器试试。

祝学习愉快!

  • 不厌_ 提问者 #1

    老师,请看一下我上面的回答,刚才使用火狐浏览器可以了,然后有一点小问题请教一下。

    2021-08-31 16:22:53
  • 不厌_ 提问者 #2

    直接在这回吧,有一点小问题想问下老师:

    cookie会自动随着浏览器每次请求发送到服务器端,是不是http://www.dell-lee.com/react/api/isLogin.json这个接口就是根据cookie判断是否在登录状态


    我点击登录后服务器响应数据里给本地浏览器设置了cookie,再点击vip按钮(相当于请求isLogin这个接口)时cookie里有值,所以服务器端判断在登录状态,所以返回的login状态就是true。


    然后点击退出后,服务端响应数据里给本地浏览器的cookie设置了到期时间,此时cookie失效了。我在点击vip按钮时,因为没有cookie了所以返回的login状态就是false


    http://img1.sycdn.imooc.com//climg/612de64209350f7925460829.jpg

    http://img1.sycdn.imooc.com//climg/612de6420934127a24520958.jpg

    http://img1.sycdn.imooc.com//climg/612de642097979ff25291010.jpg

    http://img1.sycdn.imooc.com//climg/612de64309ea88c425381325.jpg


    2021-08-31 16:39:30
不厌_ 提问者 2021-08-31 16:20:57

我用火狐浏览器试了下,发现可以了。然后有一点小问题想问下老师,

cookie会自动随着浏览器每次请求发送到服务器端,是不是http://www.dell-lee.com/react/api/isLogin.json这个接口就是根据cookie判断是否在登录状态

我点击登录后服务器响应数据里给本地浏览器设置了cookie,再点击vip按钮(相当于请求isLogin这个接口)时cookie里有值,所以服务器端判断在登录状态,所以返回的login状态就是true。

然后点击退出后,服务端响应数据里给本地浏览器的cookie设置了到期时间,此时cookie失效了。我在点击vip按钮时,因为没有cookie了所以返回的login状态就是false


http://img1.sycdn.imooc.com//climg/612de64209350f7925460829.jpg

http://img1.sycdn.imooc.com//climg/612de6420934127a24520958.jpg

http://img1.sycdn.imooc.com//climg/612de642097979ff25291010.jpg

http://img1.sycdn.imooc.com//climg/612de64309ea88c425381325.jpg


  • 同学你好,理解的是对的。登录后,服务器会把登录信息以cookie的形式保存到浏览器端;进入vip页面时,会将该cookie携带过去,后端通过该cookie判断用户是否登录。而退出时,则是后端通过某种方式将cookie删除,比如设置cookie过期了。

    祝学习愉快!

    2021-08-31 17:30:49
  • 提问者 不厌_ 回复 好帮手慕久久 #2

    好的,谢谢老师

    2021-08-31 18:26:39
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师