我实现了一个完整的堆栈Reaction和Spring Boot应用程序,我使用Spring Security进行身份验证和授权.关于授权有一种奇怪的行为.

每当我通过npm start重新启动前端应用程序并登录到应用程序时,所有必要的参数,如用户ID、JWT、角色、用户名都被正确设置为本地存储,并且应用程序导航到不需要授权的主页.However,当我点击一个需要授权的菜单时,我得到"需要完全身份验证才能访问此资源"错误.

但是,如果我在登录后通过主页上的window.location.reload()刷新页面,然后单击菜单,则不会出现错误(如果我首先导航到页面而不是主页,错误发生在刷新之前的很短时间内).

我通过postman 多次try 相同的端点,没有出现任何类似的问题.出于这个原因,似乎在react 方面缺少了一些东西.你有什么 idea 吗?

以下是我通过Axios发送的标题,但我认为没关系:

const config = {
  headers: {
    // "Access-Control-Allow-Origin": "*",
    // "Access-Control-Allow-Credentials": true,
    // "Content-Type": "application/json",
    Accept: "application/json",
    Authorization: `Bearer ${AUTH_TOKEN}`
  },
};

100

import axios from "./axios";

const headers = {
  Accept: "application/json",
  "Content-Type": "application/json",
};

const axiosInstance = axios.create({
  headers,
});

export default axiosInstance;

axiosInstance.defaults.headers.common.Authorization = `Bearer ${localStorage.getItem("tokenKey")}`;

export const getWithAuth = (url) => {
  const request = axiosInstance.get(url);
  return request.then((response) => response.data);
};

推荐答案

为什么当你第一次登录时,你会得到unauthorize,但当你刷新它时,它工作得很好?

  • 这是因为当文件第一次加载时,它没有在本地存储中找到tokenKey,然而,当您登录时,tokenKey将存储在本地存储中,并且当您刷新时,您将获得令牌.

如何解决这一问题?

service.js:

import axios from "axios";
const headers = {
  Accept: "application/json",
  "Content-Type": "application/json",
};
const axiosInstance = axios.create({
  headers,
});
export default axiosInstance;

然后,您应该在axios中设置从登录请求返回的tokenKey.

axiosInstance.defaults.headers.common.Authorization = `Bearer ${tokenKey}`;

此外,您还可以go 掉getWithAuth函数,只需在任何请求中使用axiosInstance:

export const login = async (credentials) => {
  let data;
  try {
  const response = await axiosInstance.post(`/auth/login`, {
    email: credentials?.email,
    password: credentials?.password,
  });
  const token = response?.data?.token
  axiosInstance.defaults.headers.common.Authorization = `Bearer ${token}`
  localStorage.setItem('tokenKey', token)
    //...
  } catch (err) {
       console.log(err);
  }
}

Javascript相关问答推荐

橡皮擦完全让画布变成白色

reaction useEffect KeyDown for each 条目配音输出

在页面上滚动 timeshift 动垂直滚动条

将2D数组转换为图形

Prisma具有至少一个值的多对多关系

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

使用Java脚本导入gltf场景并创建边界框

未定义引用错误:未定义&Quot;而不是&Quot;ReferenceError:在初始化&Quot;之前无法访问';a';

IF语句的计算结果与实际情况相反

本地库中的chartjs-4.4.2和chartjs-plugin-注解

如何在Svelte中从一个codec函数中调用error()?

覆盖加载器页面避免对页面上的元素进行操作

在使用REACT更改了CSS类之后,无法更改CSS样式

搜索功能不是在分页的每一页上进行搜索

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

如何确保预订系统跨不同时区的日期时间处理一致?

AJAX POST在控制器中返回空(ASP.NET MVC)

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

为什么我的Navbar.css没有显示在本地主机页面上?

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';