react 路由鉴权方案

实现思路一:

1、广播用户登录状态。
2、在路由中消费状态,选择跳转,实现路由鉴权。

请求响应接口处,主要是用于提醒用户登录状态失效,路由鉴权用于跳转登录。

//基础部分
import React, { useContext, useState } from "react";
/**
 * 创建context
 */
const ContextValue = React.createContext();

/**
 * 输出组件
 */
const Auth = () => {
  const [auth_state, setAuthState] = useState(false);
  const logIn = () => {
    // 模拟登录操作 
    setTimeout(() => {
      setAuthState(true);
    }, 200);
  };
  const logOut = () => {
    // 模拟登出操作
    setTimeout(() => {
      setAuthState(true);
    }, 200);
  };
  return {
    auth_state,
    logIn,
    logOut,
  };
};
/**
 *  设置 发布者,一般包裹根组件
 */
export const AuthProvider = ({ children }) => {
  const auth = Auth();
  return <ContextValue.Provider value={auth}>{children}</ContextValue.Provider>;
};
/**
 * 消费者 获取登陆状态 | 设置登录 | 设置登出
 */
export const CosumerAuth = () => useContext(ContextValue);
/**
 * 包裹需要的组件,或者相关路由
 */
export const RequireAuth = props => {
  const { auth_state } = CosumerAuth();
  return auth_state === true ? "已登陆" : "跳转登陆组件去登录";
};
实现思路二:

用浏览器存储 如localStorage保存登录状态,组合成组件,包裹路由

/**
*  RequireAuth 组件相当于一个拦截器,是否返回被拦截的组件要听他的
*/
export const RequireAuth = ({ children }) => {
  const authed = localStorage.getItem('login');
  return authed === 'true' ? ( 
    children
  ) : (
    <Navigate to="/user" replace />
  );
}
思路三:

在渲染路由之前做一个拦截器,判断

1、访问登录页,有token,去主页。

2、访问其他页,无token,去登录页。

3、正常渲染。

const ToPage1 = () => {
  const navigateTo = useNavigate();
  useEffect(() => {
    navigateTo("/page1");
    message.warning("您已经登陆过了!");
  }, []);
  return <></>;
};
const ToLogin = () => {
  const navigateTo = useNavigate();
  useEffect(() => {
    navigateTo("/login");
    message.warning("请登陆后再访问!");
  }, []);
  return <></>;
};
/**
 * 路由拦截
 */
const BeforeRouterEnter = () => {
  const outlet = useRoutes(routes);
  let token = localStorage.getItem("lege-token");
  const location = useLocation();
  // 访问登陆页并且有token
  if (location.pathname === "/login" && token) {
    return <ToPage1 />;
  }
  // 访问其他页并且没有token, 去登陆
  if (location.pathname !== "/login" && !token) {
    return <ToLogin />;
  }
  return outlet;
};
const App = () => {
  return (
    <div className="App">
      <BeforeRouterEnter />
    </div>
  );
};

export default App;

以上几种方式,也可以根据实际情况结合使用!结合redux,后端,用于各类状态的判定

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值