前端配置代理解决发送cookie问题

场景:

在开发任务管理系统时,我遇到了一个典型的身份认证问题:​​用户登录成功后,调获取当前用户信息接口却提示"用户未登录"​​。系统核心流程如下:

  1. ​用户登录​​:调用 /login 接口,返回 JSESSIONID Cookie
  2. ​角色分配​​:调用 /user/getCurrentUser 接口,需携带登录Cookie供后端验证身份

但实际开发中发现,角色分配接口始终返回未登录错误。通过抓包分析(抓一天了,痛苦),最终定位问题:​​跨域请求未正确携带Cookie,导致后端无法识别用户身份​​。

问题现象:

此时未配置代理的问题代码(注意这里配置了withCredentials:true,但是无效):

<script lang="ts" setup>
import axios from 'axios';const request = axios.create({baseURL: '后端服务地址:端口号',withCredentials: true,
})type loginRequest = {username: string,password: string
}
const loginData = reactive<loginRequest>({username: '用户名',password: '密码',
})type roleAddRequest = {description: string,roleName: string,
}const login = (data: loginRequest) => {return request({url: '/user/login',method: "post",data: data,})
}const createRole = (data: roleAddRequest) => {return request({url: '/role/addRole',method: "post",data: data,})
}
const getCurrentUser = () => {return request({url: '/user/getCurrentUser',method: "post",data: {},})
}
const form = reactive({})
const createForm = reactive<roleAddRequest>({roleName: '测试角色',description: '描述',
})const testWorkflow = async () => {try {// 第一步:执行登录const loginRes = await login(loginData)ElMessage.success(loginRes.data.message)console.log('登录响应', loginRes.data)// 第二步:获取当前用户信息const currentUser = await getCurrentUser()ElMessage.success(currentUser.data.message)console.log('获取响应', currentUser.data)// 第三步:创建角色const roleRes = await createRole(createForm)ElMessage.success(roleRes.data.message)console.log('创建角色', roleRes.data)} catch (error) {console.error('流程执行失败', error)ElMessage.error(axios.isAxiosError(error)? error.response?.data?.message || '请求异常': '未知错误')}
}onMounted(() => testWorkflow())
</script>

        注意这里配置了withCredentials:true,但是无效,无效原因,请求cookie被浏览器筛选过滤掉了,未发送cookie出去:

解决方式:

配置vite.config.ts文件:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vite.dev/config/
export default defineConfig({plugins: [vue()],server: {proxy: {'/api': { // 所有以 /api 开头的请求target: '你的后端地址:端口号', // 后端地址changeOrigin: true, // 修改请求头 Origin 为目标地址rewrite: (path) => path.replace(/^\/api/, '') // 移除 /api 前缀}}}
})

正确请求代码:

<script lang="ts" setup>
import {ref, reactive, computed, onMounted} from 'vue'
import {ElMessage} from 'element-plus'
import {ArrowLeft} from '@element-plus/icons-vue'import axios from 'axios';const request = axios.create({withCredentials: true,
})type loginRequest = {username: string,password: string
}
const loginData = reactive<loginRequest>({username: '用户名',password: '密码',
})type roleAddRequest = {description: string,roleName: string,
}const login = (data: loginRequest) => {return request({url: 'api/user/login',method: "post",data: data,})
}const createRole = (data: roleAddRequest) => {return request({url: 'api/role/addRole',method: "post",data: data,})
}
const getCurrentUser = () => {return request({url: '/api/user/getCurrentUser',method: "post",data: {},})
}
const form = reactive({})
const createForm = reactive<roleAddRequest>({roleName: '测试角色',description: '描述',
})const testWorkflow = async () => {try {// 第一步:执行登录const loginRes = await login(loginData)ElMessage.success(loginRes.data.message)console.log('登录响应', loginRes.data)// 第二步:获取当前用户信息const currentUser = await getCurrentUser()ElMessage.success(currentUser.data.message)console.log('获取响应', currentUser.data)// 第三步:创建角色const roleRes = await createRole(createForm)ElMessage.success(roleRes.data.message)console.log('创建角色', roleRes.data)} catch (error) {console.error('流程执行失败', error)ElMessage.error(axios.isAxiosError(error)? error.response?.data?.message || '请求异常': '未知错误')}
}onMounted(() => testWorkflow())</script>

运行,请求携带cookie:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8.1 线性变换的思想

一、线性变换的概念 当一个矩阵 A A A 乘一个向量 v \boldsymbol v v 时&#xff0c;它将 v \boldsymbol v v “变换” 成另一个向量 A v A\boldsymbol v Av. 输入 v \boldsymbol v v&#xff0c;输出 T ( v ) A v T(\boldsymbol v)A\boldsymbol v T(v)Av. 变换 T T T…

【java实现+4种变体完整例子】排序算法中【冒泡排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是冒泡排序的详细解析&#xff0c;包含基础实现、常见变体的完整代码示例&#xff0c;以及各变体的对比表格&#xff1a; 一、冒泡排序基础实现 原理 通过重复遍历数组&#xff0c;比较相邻元素并交换逆序对&#xff0c;逐步将最大值“冒泡”到数组末尾。 代码示例 pu…

系统架构设计(二):基于架构的软件设计方法ABSD

“基于架构的软件设计方法”&#xff08;Architecture-Based Software Design, ABSD&#xff09;是一种通过从软件架构层面出发指导详细设计的系统化方法。它旨在桥接架构设计与详细设计之间的鸿沟&#xff0c;确保系统的高层结构能够有效指导后续开发。 ABSD 的核心思想 ABS…

Office文件内容提取 | 获取Word文件内容 |Javascript提取PDF文字内容 |PPT文档文字内容提取

关于Office系列文件文字内容的提取 本文主要通过接口的方式获取Office文件和PDF、OFD文件的文字内容。适用于需要获取Word、OFD、PDF、PPT等文件内容的提取实现。例如在线文字统计以及论文文字内容的提取。 一、提取Word及WPS文档的文字内容。 支持以下文件格式&#xff1a; …

Cesium学习笔记——dem/tif地形的分块与加载

前言 在Cesium的学习中&#xff0c;学会读文档十分重要&#xff01;&#xff01;&#xff01;在这里附上Cesium中英文文档1.117。 在Cesium项目中&#xff0c;在平坦坦地球中加入三维地形不仅可以增强真实感与可视化效果&#xff0c;还可以​​提升用户体验与交互性&#xff0c…

Spring Boot 断点续传实战:大文件上传不再怕网络中断

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、痛点与挑战 在网络传输大文件&#xff08;如视频、数据集、设计稿&#xff09;时&#xff0c;常面临&#xff1a; 上传中途网络中断需重新开始服务器内…

数码管LED显示屏矩阵驱动技术详解

1. 矩阵驱动原理 矩阵驱动是LED显示屏常用的一种高效驱动方式&#xff0c;利用COM&#xff08;Common&#xff0c;公共端&#xff09;和SEG&#xff08;Segment&#xff0c;段选&#xff09;线的交叉点控制单个LED的亮灭。相比直接驱动&#xff0c;矩阵驱动可以显著减少所需I/…

【上位机——MFC】菜单类与工具栏

菜单类 CMenu&#xff0c;封装了关于菜单的各种操作成员函数&#xff0c;另外还封装了一个非常重要的成员变量m_hMenu(菜单句柄) 菜单使用 添加菜单资源加载菜单 工具栏相关类 CToolBarCtrl-》父类是CWnd&#xff0c;封装了关于工具栏控件的各种操作。 CToolBar-》父类是CC…

liunx中常用操作

查看或修改linux本地mysql端口 cat /etc/my.cnf 如果没有port可以添加&#xff0c;有可以修改 查看本地端口占用情况 bash netstat -nlt | grep 3307 HADOOP集群 hdfs启动与停止 # 一键启动hdfs集群 start-dfs.sh # 一键关闭hdfs集群 stop-dfs.sh #除了一键启停外&#x…

衡石chatbi如何通过 iframe 集成

iframe 集成方式是最简单的一种&#xff0c;您只需要在您的 HTML 文件中&#xff08;或 Vue/React 组件中&#xff09;添加一个 iframe 元素&#xff0c;并设置其 src 属性为 AI 助手的 URL。 <iframesrc"https://develop.hengshi.org/copilot"width"100%&q…

Java集合框架深度解析:HashMap、HashSet、TreeMap、TreeSet与哈希表原理详解

一、核心数据结构总览 1. 核心类继承体系 graph TDMap接口 --> HashMapMap接口 --> TreeMapSet接口 --> HashSetSet接口 --> TreeSetHashMap --> LinkedHashMapHashSet --> LinkedHashSetTreeMap --> NavigableMapTreeSet --> NavigableSet 2. 核心特…

HTTP 1.0 和 2.0 的区别

HTTP 1.0 和 2.0 的核心区别体现在性能优化、协议设计和功能扩展上&#xff0c;以下是具体对比&#xff1a; 一、核心区别对比 特性HTTP 1.0HTTP 2.0连接方式非持久连接&#xff08;默认每次请求新建 TCP 连接&#xff09;持久连接&#xff08;默认保持连接&#xff0c;可复用…

gnome中删除application中失效的图标

什么是Application 这一块的东西应该叫application&#xff0c;准确来说应该是applications。 正文 系统级&#xff1a;/usr/share/applications 用户级&#xff1a;~/.local/share/applications ying192 ~/.l/s/applications> ls | grep xampp xampp.desktoprm ~/.local…

OpenFeign 使用教程:从入门到实践

文章目录 一、什么是 OpenFeign&#xff1f;1、什么是 OpenFeign&#xff1f;2、什么是 Feign&#xff1f;3、OpenFeign 与 Feign 的关系4、为什么选择 OpenFeign&#xff1f;5、总结 二、OpenFeign 的使用步骤1. 导入依赖2. 启用 OpenFeign3. 配置 Nacos 三、FeignClient 参数…

蓝桥杯 16.对局匹配

对局匹配 原题目链接 题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分&#xff0c;代表他的围棋水平。 小明发现&#xff0c;网站的自动对局系统在匹配对手时&#xff0c;只会将积分差恰好是 K 的两名用户匹配在一起。如果两人分差小…

C#常用LINQ

在开发时发现别人的代码使用到了LINQ十分便捷且清晰&#xff0c;这里记录一下常用LINQ和对应的使用。参考链接&#xff1a;LINQ 菜鸟教程 使用的学生类和字符串用于测试 public class Student {public int StudentID;public string StudentName;public int Age; }Student[] st…

单例模式(线程安全)

1.什么是单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单…

Python 之 __file__ 变量导致打包 exe 后路径输出不一致的问题

现象 做项目的时候&#xff0c;一直使用 os.path.dirname(os.path.abspath(__file__)) 来获取当前目录。然而&#xff0c;最近却遇到了一个路径相关的问题。直接运行 py 文件是正常的&#xff0c;但是打包成 exe 之后&#xff0c;却显示因为路径问题导致程序报错无法继续执行。…

PH热榜 | 2025-04-21

1. Google Whisk 2.0 标语&#xff1a;将图像转换为八秒的动画短片。 介绍&#xff1a;Whisk 是谷歌实验室的一项新创新&#xff0c;现在推出了 Whisk Animate——它可以将你的图片转换成生动的8秒视频&#xff0c;采用了 Veo 2 技术。此功能现已在60多个国家的 Google One A…

AI大模型 —— 国产大模型 —— 华为大模型

有这么一句话&#xff0c;那就是AI大模型分两种&#xff0c;一种是大模型&#xff1b;另一种是华为大模型。 如果从技术角度来分析&#xff0c;华为的技术不论是在软件还是硬件都比国外的大公司差距极大&#xff0c;甚至有些技术评论者认为华为的软硬件技术至少落后2.5代&#…