如何保护 ReactJs 中的路由?

Posted

技术标签:

【中文标题】如何保护 ReactJs 中的路由?【英文标题】:How can I protect routes in ReactJs? 【发布时间】:2021-04-30 17:53:09 【问题描述】:

我正在尝试使用 reactjs 和钩子来保护我的路线。但是有一个问题。即使在 setUser() 和 setToken() 中使用新值,用户和令牌也不会更新。这导致我无法保护我的路线。所以我希望有人能帮我解决这个问题!!!

import React,  useState,useEffect from 'react'
import  Redirect  from 'react-router-dom'

function ProtectedRoutes(props) 
    const [user, setUser] = useState()
    const [token, setToken] = useState(null)
    const Component = props.component

    useEffect(() => 
        //
            const getUser = async () => 
        
                //Retreive Token
                const sessionToken = await sessionStorage.getItem('token')
                setToken(sessionToken)

                //Fetch User    
                const response = await fetch(`$process.env.REACT_APP_URLapi/users/me`, 
                    method: 'get',
                    headers: new Headers(
                        "x-auth-token": `$token`
                    )
                )
                const result = await response.json();
                setUser(result)
                //
            
       
        getUser()
        
        return ()=> 
       
    ,[token,user])
    
    //Token
    if (!token || Object.keys(user).length !== 2) 
        return <Redirect to= pathname: '/connexion'  />
    
    return <Component/>



export default ProtectedRoutes

【问题讨论】:

【参考方案1】:

试试这样的

import React from "react";
import  Redirect  from "react-router-dom";

const isAuthenticated = async () => 
  const sessionToken = sessionStorage.getItem("token");

  const response = await fetch(`$process.env.REACT_APP_URLapi/users/me`, 
    method: "get",
    headers: new Headers( "x-auth-token": `$sessionToken` )
  );
  const result = await response.json();

  return !!sessionToken && !!(Object.keys(result).length !== 2);
;

function ProtectedRoutes(props) 
  const Component = props.component;

  return isAuthenticated() ? (
    <Component />
  ) : (
    <Redirect to= pathname: "/connexion"  />
  );


export default ProtectedRoutes;

【讨论】:

以上是关于如何保护 ReactJs 中的路由?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ReactJS 中的外部函数重定向到路由

如何从 ReactJS 组件调用 Laravel Api 路由?

ReactJS 中的动态路由到底是啥

如何在 reactjs 的不同组件中编写链接和路由

如何在ReactJS中的模糊路由中的第一次匹配时停止路由器匹配

在生产中管理 reactjs 应用程序中的路由