ReactJS 通过 API 调用保护路由

2024-04-18

我正在尝试保护 ReactJS 中的路由。 在每个受保护的路由上,我想检查保存在 localStorage 中的用户是否良好。

下面你可以看到我的路线文件(app.js):

class App extends Component {
    render() {
        return (
            <div>
                <Header />
                <Switch>
                    <Route exact path="/" component={Home} />
                    <Route path="/login" component={Login} />
                    <Route path="/signup" component={SignUp} />
                    <Route path="/contact" component={Contact} />
                    <ProtectedRoute exac path="/user" component={Profile} />
                    <ProtectedRoute path="/user/person" component={SignUpPerson} />
                    <Route component={NotFound} />
                </Switch>
                <Footer />
            </div>
        );
    }
}

我的 protectedRoute 文件:

const ProtectedRoute = ({ component: Component, ...rest }) => (
    <Route {...rest} render={props => (
        AuthService.isRightUser() ? (
            <Component {...props} />
        ) : (
            <Redirect to={{
                pathname: '/login',
                state: { from: props.location }
            }}/>
        )
    )} />
);

export default ProtectedRoute;

还有我的功能isRightUser。该函数发送一个status(401)当数据对于登录的用户无效时:

async isRightUser() {
    var result = true;
    //get token user saved in localStorage
    const userAuth = this.get();

    if (userAuth) {
        await axios.get('/api/users/user', {
            headers: { Authorization: userAuth }
        }).catch(err => {
            if (!err.response.data.auth) {
                //Clear localStorage
                //this.clear();
            }

            result = false;
        });
    }

    return result;
}

这段代码不起作用,我不知道为什么。 也许我需要调用我的函数AuthService.isRightUser() with a await在调用之前并将我的函数置于异步状态?

如何更新代码以在访问受保护页面之前检查我的用户?


我遇到了同样的问题,并通过将受保护的路线设置为有状态类来解决它。

我使用的内部开关

<PrivateRoute 
    path="/path"
    component={Discover}
    exact={true}
/>

我的 PrivateRoute 类如下

class PrivateRoute extends React.Component {

    constructor(props, context) {
        super(props, context);

        this.state = {
            isLoading: true,
            isLoggedIn: false
        };

        // Your axios call here

        // For success, update state like
        this.setState(() => ({ isLoading: false, isLoggedIn: true }));

        // For fail, update state like
        this.setState(() => ({ isLoading: false, isLoggedIn: false }));

    }

    render() {

        return this.state.isLoading ? null :
            this.state.isLoggedIn ?
            <Route path={this.props.path} component={this.props.component} exact={this.props.exact}/> :
            <Redirect to={{ pathname: '/login', state: { from: this.props.location } }} />

    }

}

export default PrivateRoute;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReactJS 通过 API 调用保护路由 的相关文章

随机推荐

  • AFNetworking 2.0取消特定任务

    我正在尝试 afnetworking 2 0 只是想弄清楚如何取消特定任务 旧的方法是使用类似的东西 self cancelAllHTTPOperationsWithMethod POST path user receipts 但我在 2
  • 有没有一种方法可以在不使用 PHP 或 JavaScript 的情况下拉伸文本区域以适应其内容?

    我正在用内容填充文本区域供用户编辑 是否可以使用 CSS 使其拉伸以适应内容 例如overflow show对于一个div 仅一行
  • Ajax 深度链接? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Laravel 未定义

    好吧 我正在使用新的 laravel 5 3 和 vue js 我想对数据库中的一些用户进行 GET 调用 顺便说一句 我正在使用组件 这是我的 app js require bootstrap Vue component example
  • 将 Apache Camel CMIS 与 Sharepoint 2013 结合使用

    我可以从 Chrome REST 客户端成功访问 Sharepoint 2013 AtomPub 界面 以下 URL 为我提供了我想要的文件 http ourintranet 100 personal myname vti bin cmis
  • UITableViewCell 中的 UIScrollView 不滚动

    我正在向具有滚动视图的 UITableView 添加一个单元格 单元格中的代码是 UIScrollView scrollView UIScrollView alloc initWithFrame CGRectMake 0 30 320 44
  • 使用 jQuery 显示 div。 CSS问题

    我有三个 divdisplay inline block 在每个 div 中我都有 divdisplay none当我试图显示隐藏的 div 时 div id show 1000 最近的 div 跳跃 我应该改变什么 我确实喜欢看到 div
  • Java EE 5 API 的单个/完整 Maven 依赖项

    是否有包含整个 Java EE 5 规范 API 的单个 Maven 依赖项 就像
  • Git Push 澄清 - 推送什么?

    When I push http www kernel org pub software scm git docs git push html本地工作目录到中央存储库 执行all中间分支和提交信息 从上次推送到这次 是否被推送 换句话说 是
  • 使用无符号整数溢出是一个好的做法吗?

    前几天我正在阅读 C 标准 并注意到与有符号整数溢出 未定义 不同 无符号整数溢出有明确的定义 我已经看到它在很多代码中用于最大值等 但是考虑到有关溢出的巫毒 这被认为是良好的编程实践吗 无论如何都是不安全的吗 我知道许多现代语言 例如 P
  • 同时打印到屏幕并写入文件

    我在网上找到了一些通常有效的代码 但我想在同一个程序中多次使用它 将不同的内容写入不同的文件 同时仍然始终打印到屏幕上 也就是说 当它关闭时 我认为 sys stdout 关闭 因此根本无法打印 并且再次使用此类会失败 我尝试重新导入 sy
  • 在 MATLAB 中数值计算复值函数的导数

    我想在 MATLAB 中以数值方式计算复值函数 全纯函数 的导数 我已经计算了复平面上网格中的函数 并且尝试使用柯西 黎曼关系来计算导数 鉴于 u 实数 f v imag f x 实数 点 y imag 点 导数应由下式给出 f du dx
  • 如何在 Pygame 中翻转图像

    我希望图像在向右移动时朝右 在向左移动时朝左 我不知道在这里要做什么 这是一项作业 不需要翻转图像 但我仍然想学习如何做到这一点 Author victor Xu Date January 21st 2021 Description Ani
  • 我可以获取指纹值吗?

    我尝试获取指纹值并存储它 之后 我尝试比较一下 value 与来自另一个硬件的指纹值 指纹 sensor Q1 他们之间可以比较吗 Q2 如果可以的话 我怎样才能获得这个值 我搜索过这些问题 发现这是不可能的 但我觉得 获取指纹信息的方法是
  • Realloc 在循环内第 10 次迭代后失败

    我试图从用户那里获取一系列字母 并将输入放入动态数组中 然而 由于我不太明白的原因 如果用户输入超过 10 个字母 则 realloc 失败 返回 NULL 并打印 分配内存时出错 我确实尝试将 realloc 更改为 calloc 这似乎
  • 释放Java 7 WatchService的资源

    我正在使用 Java 7 WatchService 来监视目录 我不断地改变我正在观看的目录 我遇到了异常 java io IOException 已达到网络 BIOS 命令限制 50 个目录之后 我确信在创建新的 WatchService
  • Django '/' 仅主页 url 错误

    我正在使用 Django 2 0 现在我不知道如何为主页创建一个 空 url 意思是 我希望它路由到web com or web com 我尝试了这段代码 但它不起作用 urlpatterns path admin admin site u
  • 使用 Java 将文件附加到 zip 文件

    我当前正在提取一个 war 文件的内容 然后将一些新文件添加到目录结构中 然后创建一个新的 war 文件 这一切都是通过Java以编程方式完成的 但我想知道复制战争文件然后附加文件是否会更有效 然后我就不必等待战争扩大然后必须再次被压缩 我
  • 如何找到射线与移动圆的第一个交点

    我已经在一个问题上苦苦挣扎了一段时间 到目前为止还没有找到比天真的解决方案更好的解决方案 N circles are given that are moving according to a linear law For each of t
  • ReactJS 通过 API 调用保护路由

    我正在尝试保护 ReactJS 中的路由 在每个受保护的路由上 我想检查保存在 localStorage 中的用户是否良好 下面你可以看到我的路线文件 app js class App extends Component render re