react项目中token失效路由跳转处理

react路由介绍

在react中有两种路由模式,分别是 hashhistory , 为了方便大家理解,我们先来了解下这两个路由

两者区别

外观

使用hash模式下的URL,网络路径中会有一个#号进行拼接,而history没有带 #

兼容性

hash能够兼容到IE8,history只能够兼容到IE10

运行原理

hash是通过window.onhashchange的方式进行监听变化,从而实现无刷新跳转,每次hash变化都会触发网页跳转,也就是浏览器的前进和后退,虽然hash会改变URL,但是不会触发页面重新加载。简而言之所有页面的跳转都是在客户端进行的,跳转的过程不算是一次http请求,所以这种模式对SEO优化是很不友好的。

history模式在对当前页面进行刷新时,此时浏览器会重新发起请求。history是利用H5的 history中新增的两个API pushState()replaceState() 和一个事件onpopstate来监听URL变化,history每次刷新都会重新请求服务器,需要服务端来允许地址是否可访问,如果没有设置的话,会导致404页面。

如果对项目没有特殊要求,可以直接使用hash模式开发,如果需要SEO优化那么一定要选history

react路由使用

了解了hashhistory基础介绍之后,我们接着引入react项目下token失效之后怎么跳转到登录页面

hash模式路由跳转处理

首先路由模块是引入HashRouter==> hash模式的

import { HashRouter as Router, Route, Switch, Redirect } from 'react-router-dom';
import Login from '@/pages/login';
import BlogMenu from '@/pages/layout';
import Register from '@/pages/register';
import NotFound from '@/pages/404';
  <Router>
  	<Switch>
      <Route path="/api/login" component={Login}></Route>
      <Route path="/api/register" component={Register}></Route>
      <Route
        path="/"
        render={() =>
        	localStorage.getItem('token') ? (
              <BlogMenu />
            ) : (
            	<Redirect to="/api/login"></Redirect>
            )
          }
        ></Route>
        <Route path="*" component={NotFound}></Route>
  	</Switch>
  </Router>

utils -> http.js 请求文件中进行验证的处理

        case 401:
          // token
          console.log('服务器认证失败');
          localStorage.removeItem('token');
          // 退出登录
          window.location.href = '#/api/login';
          break;

使用原生的window方法,强制跳转到 login 页面,这种方式在hash模式下没有问题,在history下跳转时会出现白屏的情况

history模式路由跳转处理

utils 文件夹中新建一个history.js文件,引入history并导出

import { createBrowserHistory } from 'history';

export default createBrowserHistory();

hash模式路由进行修改,找到路由文件,将 HashRouter as Router修改为Router,然后引入history文件,在标签<Router>中引入history

import { Router, Route, Switch, Redirect } from 'react-router-dom';
import Login from '@/pages/login';
import BlogMenu from '@/pages/layout';
import Register from '@/pages/register';
import NotFound from '@/pages/404';
import history from '@/utils/history';

  <Router history={history}>
  	<Switch>
      <Route path="/api/login" component={Login}></Route>
      <Route path="/api/register" component={Register}></Route>
      <Route
        path="/"
        render={() =>
        	localStorage.getItem('token') ? (
              <BlogMenu />
            ) : (
            	<Redirect to="/api/login"></Redirect>
            )
          }
        ></Route>
        <Route path="*" component={NotFound}></Route>
  	</Switch>
  </Router>

utils -> http.js 请求文件中引入history文件,进行路由的跳转

import history from './history';
history.push('/api/login')

参考链接:

react 中token失效Router路由跳回login页面的(history出现白屏)解决方案

hash和history的区别

个人博客已上线,欢迎来访~
传送门:夜雨炊烟

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React Native,可以使用AsyncStorage来存储用户的token,并在应用启动时检查token是否存在和是否过期。如果token不存在或过期,可以使用React Navigation进行页面跳转到登录页。 下面是一个简单的实现示例: 1. 在应用启动时,检查token是否存在和是否过期: ``` import AsyncStorage from '@react-native-async-storage/async-storage'; // 检查token是否存在和是否过期 const checkToken = async () => { try { const token = await AsyncStorage.getItem('token'); const expiry = await AsyncStorage.getItem('expiry'); if (token && expiry && Date.now() < parseInt(expiry)) { // token存在且未过期,可以直接使用 return true; } else { // token不存在或已过期,需要重新登录 return false; } } catch (error) { // 处理错误 console.log(error); return false; } } // 在应用启动时检查token const App = () => { const [isAuthenticated, setIsAuthenticated] = useState(false); useEffect(() => { checkToken().then((result) => { setIsAuthenticated(result); }); }, []); // ... } ``` 2. 在需要跳转到登录页的地方,使用React Navigation进行页面跳转: ``` import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; const Stack = createStackNavigator(); const App = () => { const [isAuthenticated, setIsAuthenticated] = useState(false); // ... return ( <NavigationContainer> <Stack.Navigator> {isAuthenticated ? ( // 已登录,显示主页 <Stack.Screen name="Home" component={HomeScreen} /> ) : ( // 未登录,显示登录页 <Stack.Screen name="Login" component={LoginScreen} /> )} </Stack.Navigator> </NavigationContainer> ); } ``` 在登录成功后,可以将新的token过期时间存储到AsyncStorage,以便下次使用。同时,需要在每个需要使用token的请求添加token头部,以确保请求的合法性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨炊烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值