Reactjs 重定向反应路由器dom身份验证不工作
登录后,它不会失败地重定向到电池页,因为路由认为它阻止的头中没有令牌。我已经试了两天多了,请给我一些好的灵魂。后端的所有逻辑都已完美运行。无法替换用户登录和生成令牌的路径。系统将其重定向到电池路径 登录类Reactjs 重定向反应路由器dom身份验证不工作,reactjs,redux,Reactjs,Redux,登录后,它不会失败地重定向到电池页,因为路由认为它阻止的头中没有令牌。我已经试了两天多了,请给我一些好的灵魂。后端的所有逻辑都已完美运行。无法替换用户登录和生成令牌的路径。系统将其重定向到电池路径 登录类 import React, { Component } from 'react' import IntanceAxios from '../../components/meuaxios' // import GlobalStyle from './style.jsx'; import Form
import React, { Component } from 'react'
import IntanceAxios from '../../components/meuaxios'
// import GlobalStyle from './style.jsx';
import Form from './Form.jsx'
import { /* useSelector, useDispatch ,*/ connect } from 'react-redux';
import { withRouter } from "react-router-dom";
import history from '../../routes/History';
class Login extends Component {
constructor() {
super();
this.handleSubmit = this.handleSubmit.bind(this);
this.handleEmailChange = this.handleEmailChange.bind(this);
this.handlePasswordChange = this.handlePasswordChange.bind(this);
this.state = {
email: JSON.parse(localStorage.getItem('isRememberUser')) ? localStorage.getItem('user') : undefined,
password: undefined,
signIn: {
success: undefined,
message: undefined,
load: undefined,
type_error: 'error'
},
fieldErrors: {
email: {
message: '',
isValid: true
},
password: {
message: '',
isValid: true
}
},
logged: false,
loadedOne: true
}
document.title = "Login"
}
// Initialization
componentWillMount() {
let isRememberUser = JSON.parse(localStorage.getItem('isRememberUser'))
if (isRememberUser && localStorage.getItem('user') === null) {
localStorage.removeItem('isRememberUser')
}
}
// Monteded
componentDidMount() {
this.setState({
loadedOne: false
})
}
validEmail = email => {
// eslint-disable-next-line no-useless-escape
const validEmailRegex = RegExp(/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i);
return validEmailRegex.test(email)
}
handleEmailChange(e) {
var value = e.target.value
let fieldEmail = this.validEmail(value) ? true : false;
let message = fieldEmail ? '' : 'Email esta inválido'
this.setState(prevState => {
return {
email: value,
fieldErrors: {
email: {
message: message,
isValid: fieldEmail
},
password: {
message: prevState.fieldErrors.password.message,
isValid: prevState.fieldErrors.password.isValid
}
}
}
})
}
handlePasswordChange(e) {
var value = e.target.value
let fieldPassoword =
value.length < 8 ? false : true;
let message = fieldPassoword ? '' : 'A senha deve conter mais de 8 caracteres!'
this.setState(prevState => {
return {
password: value,
fieldErrors: {
password: {
message: message,
isValid: fieldPassoword
},
email: {
message: prevState.fieldErrors.email.message,
isValid: prevState.fieldErrors.email.isValid
}
}
}
})
}
isValid() {
let { email, password } = this.state.fieldErrors
if (email.isValid && password.isValid) {
return true
}
return false
}
setUserRemember = () => {
if (JSON.parse(localStorage.getItem('isRememberUser'))) {
localStorage.setItem('user', this.state.email)
}
return;
}
setToken = token => {
return localStorage.setItem('ISA)_TOKEN', token);
}
async handleSubmit(event) {
event.preventDefault();
if (!this.state.email || this.state.email === undefined || this.state.password === undefined || !this.state.password) {
this.setState(prevState => {
return {
...this.state,
signIn: {
message: 'E-mail ou senha vazio',
success: false,
type_error: 'error'
}, logged: false,
fieldErrors: {
password: {
message: prevState.fieldErrors.password.message,
isValid: false
},
email: {
message: prevState.fieldErrors.email.message,
isValid: false
}
}
}
})
return null;
}
if (this.isValid()) {
this.setUserRemember();
this.setState({
...this.state,
signIn: {
load: true,
success: undefined,
type_error: undefined
}
});
// console.log(dataToSend);
let dataToSend = {
email: this.state.email,
password: this.state.password
}
let url = '/auth/login';
await IntanceAxios.post(url, dataToSend)
.then(response => response.data)
.then(responseData => {
if (responseData.success) {
// this.props.disparaLogin();
// this.props.verificarToken();
this.setToken(responseData.token)
this.setState({
...this.state,
signIn: {
success: true,
message: responseData.message,
}, logged: true
, status: true
});
let { from } = this.props.location || { from: { pathname: "/batteries" } };
console.log(from)
history.replace(from)
// history.replace(from);
// REDIRECIONA PARA O LOCAL RAIZ, FEITO NA UNHA
// this.setState({ redirectToReferrer: true });
} else {
this.setState({
...this.state,
signIn: {
success: false,
message: responseData.message,
type_error: 'error'
}, status: false
, logged: false,
})
}
}).catch(error => {
this.removeRember();
this.setState({
...this.state,
signIn: {
success: false,
message: error.message,
type_error: 'error'
}, status: false
, logged: false,
});
console.log(error);
});
} else {
this.removeRember()
return;
}
}
removeRember = () => {
if (localStorage.getItem('user') !== null) {
localStorage.removeItem('user')
localStorage.setItem('isRememberUser', false)
}
return;
}
render() {
const { signIn, fieldErrors, email, password, loadedOne } = this.state
return (
<>
{/* <Header /> */}
{/* <GlobalStyle /> */}
<Form loadedOne={loadedOne} signIn={signIn} email={email} password={password} fieldErrors={fieldErrors} handleSubmit={this.handleSubmit.bind()} handleEmailChange={this.handleEmailChange.bind()} handlePasswordChange={this.handlePasswordChange.bind()} />
</>
)
}
}
// export default Login;
const mapearAcoes = dispatch => {
return {
disparaLogin: () => dispatch({ type: 'SIGN_IN' }),
verificarToken: () => dispatch({ type: 'vericarToken' })
}
}
export default withRouter(Login);
上述代码通过尝试“将文本类型的受控输入更改为非受控”触发附加(非相关)警告。要解决此问题,请将
FormComponent
切换到a,使用组件状态管理输入值和验证,并将所需的方法绑定为prop以处理登录请求或某些异步验证
与自动验证问题相关,这似乎是因为当应用程序加载时,路由器
模块已经设置了responseIsAuthenticated
值,提前评估令牌状态。要确保始终评估当前状态,必须在渲染
道具中调用isAuthenticated
方法:
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
// Call to isAuthenticated here.
isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: "/login", state: { from: props.location } }} />
)
)} />
)
上述代码通过尝试“将文本类型的受控输入更改为非受控”触发附加(非相关)警告。要解决此问题,请将
FormComponent
切换到a,使用组件状态管理输入值和验证,并将所需的方法绑定为prop以处理登录请求或某些异步验证
与自动验证问题相关,这似乎是因为当应用程序加载时,路由器
模块已经设置了responseIsAuthenticated
值,提前评估令牌状态。要确保始终评估当前状态,必须在渲染
道具中调用isAuthenticated
方法:
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
// Call to isAuthenticated here.
isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: "/login", state: { from: props.location } }} />
)
)} />
)
我爱你,伙计,你解决了我的问题。非常感谢。很快回答了我的问题,谢谢。我爱你,伙计,你解决了我的问题。非常感谢。很快回答了我的问题,谢谢。
export const isAuthenticated = () => {
// let autheticated = false;
let token = localStorage.getItem('ISA)_TOKEN');
if (!token) {
// this.redirectToReferrer(false);
// let autheticated = false
return false
} else {
let url = 'http://localhost:5000/auth/verifytoken ';
fetch(url, {
method: "GET",
body: undefined,
headers: {
"Content-Type": "application/json",
"authorization": `Bearer ${token}`
}
})
.then(response => response.json())
.then(responseData => {
if (!responseData.success) {
localStorage.removeItem('ISA)_TOKEN');
window.location.replace('/')
return null;
}
// this.redirectToReferrer(true);
}).catch(error => {
localStorage.removeItem('ISA)_TOKEN');
window.location.replace('/')
});
return true;
}
}
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
// Call to isAuthenticated here.
isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: "/login", state: { from: props.location } }} />
)
)} />
)
render() {
const { signIn, fieldErrors, email, password, loadedOne } = this.state
if(signIn.success)
return <Redirect to={{ pathname: "/batteries"}} />;
/* <Form /> */