跨域引起的两个接口的session_id不是同一个
来源场景:
@RequestMapping(“/captcha”)接口设置了SESSION_KEY,也能获取到,但是到了@PostMapping(“/login”)接口就是空的,由于跨域导致的两个session_id不是同一个

/*** 系统用户 前端控制器*/
@Controller
@CrossOrigin(origins = "*",maxAge = 3600)// 前端请求发生跨域错误,加入这段处理
@RequestMapping("/sys")
public class LoginController {private static final String SESSION_KEY = "captcha";@Autowiredprivate IAdminService adminService;/*** 验证码生成* @param request 请求报文* @param response 响应报文* */@RequestMapping("/captcha")public void generate(HttpServletRequest request, HttpServletResponse response) throws Exception {// 英文与数字验证码SpecCaptcha captcha = new SpecCaptcha();captcha.setLen(4);// 验证字符数// 结果String result = captcha.text();// 将结果存储到session中(由于有些验证码没存储结果,则需要自己存储,记得要转小写,可参考自带校验方法.ver)request.getSession().setAttribute(SESSION_KEY, result.toLowerCase());System.out.println("Session ID in /captcha: " + request.getSession().getId());System.out.println(request.getSession().getAttribute(SESSION_KEY));// 响应到前端captcha.out(response.getOutputStream());}/*** 登录* @return*/@PostMapping("/login")@ResponseBodypublic R login(HttpServletRequest request,@RequestBody Admin admin){
// 打印调试信息System.out.println("Session ID in /login: " + request.getSession().getId());System.out.println("SESSION_KEY retrieved in /login: " + request.getSession().getAttribute(SESSION_KEY));if(StringUtil.isEmpty(admin.getUserName())){return R.error("用户名不能为空");}if(StringUtil.isEmpty(admin.getPassword())){return R.error("密码不能为空");}String code = (String) request.getSession().getAttribute(SESSION_KEY);System.out.println(code);System.out.println(admin.getCaptcha());if (!CaptchaUtil.ver(admin.getCaptcha(), request)) {return R.error("验证码错误");}//开始数据库校验Admin resultAdmin = adminService.getOne(new QueryWrapper<Admin>().eq("userName",admin.getUserName()));if (resultAdmin==null){return R.error("用户名不存在!");}if (!resultAdmin.getPassword().trim().equals(admin.getPassword())){return R.error("用户名或密码错误!");}
// String token = JwtUtils.createJWT("-1", "admin", SystemConstant.JWT_TTL);
// Map<String,Object> resultMap=new HashMap<>();
// resultMap.put("token",token);return R.ok();}}
后端跨域配置
/*** web项目配置类*/
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE","OPTIONS").maxAge(3600);}}
前端使用axios发请求,需要添加
withCredentials: ‘include’, // 确保请求携带Cookie
下面是封装过的axios.js文件
// 引入axios
import axios from 'axios';
let baseUrl="http://localhost:8082/"
let imageUrl = "http://localhost:1111"
// 创建axios实例
const httpService = axios.create({// url前缀-'http:xxx.xxx'// baseURL: process.env.BASE_API, // 需自定义baseURL:baseUrl,withCredentials: 'include', // 确保请求携带Cookie// 请求超时时间//timeout: 3000 // 需自定义timeout: 10000
});//添加请求和响应拦截器
// 添加请求拦截器
httpService.interceptors.request.use(function (config) {// 在发送请求之前做些什么// config.headers.token=window.sessionStorage.getItem('token') || '';return config;
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
});// 添加响应拦截器
httpService.interceptors.response.use(function (response) {// 对响应数据做点什么return response;
}, function (error) {// 对响应错误做点什么return Promise.reject(error);
});/*网络请求部分*//** get请求* url:请求地址* params:参数* */
export function get(url, params = {}) {return new Promise((resolve, reject) => {httpService({url: url,method: 'get',params: params}).then(response => {resolve(response);}).catch(error => {reject(error);});});
}/** post请求* url:请求地址* params:参数* */
export function post(url, params = {}) {return new Promise((resolve, reject) => {httpService({url: url,method: 'post',data: params}).then(response => {console.log(response)resolve(response);}).catch(error => {console.log(error)reject(error);});});
}/** 文件上传* url:请求地址* params:参数* */
export function fileUpload(url, params = {}) {return new Promise((resolve, reject) => {httpService({url: url,method: 'post',data: params,headers: { 'Content-Type': 'multipart/form-data' }}).then(response => {resolve(response);}).catch(error => {reject(error);});});
}
export function getServerUrl(){return baseUrl;
}
export function getImageUrl(){return imageUrl;
}
export default {get,post,fileUpload
}
相关文章:
跨域引起的两个接口的session_id不是同一个
来源场景: RequestMapping(“/captcha”)接口设置了SESSION_KEY,也能获取到,但是到了PostMapping(“/login”)接口就是空的,由于跨域导致的两个session_id不是同一个 /*** 系统用户 前端控制器*/ Controller CrossOrigin(origins…...
解释一下前端框架中的虚拟DOM(virtual DOM)和实际DOM(real DOM)之间的关系。
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
【MyBatis-Plus】之queryWrapper.apply用法
目录 一、queryWrapper.apply的含义及其用法 二、其他方法 三、注意事项 官网地址:MyBatis-Plus https://baomidou.com/ 一、queryWrapper.apply的含义及其用法 QueryWrapper.apply() 是 MyBatis-Plus 提供的方法,用于构建动态 SQL 查询条件。它允许…...
Centos中安装Docker及Docker的使用
在centos7系统中安装指定版本的docker,并通过docker使用安装mysql为例,阐述docker的使用。 2.1、Docker卸载及安装yum依赖 【卸载Docker,如果安装的Docker的版本不合适】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…...
亿道推出重磅加固平板!为行业发展注入新动力
随着科技生产力的不断发展,各行各业都得到质的飞跃。产品的迭代速度也大大加快,作为全球领先的加固行移动终端一站式提供商,亿道信息跟紧时代潮流,推出EM-I10J、EM-I20J两款均衡型加固平板,为行业发展注入新动力。 接地…...
Gemma谷歌(google)开源大模型微调实战(fintune gemma-2b)
Gemma-SFT Gemma-SFT(谷歌, Google), gemma-2b/gemma-7b微调(transformers)/LORA(peft)/推理 项目地址 https://github.com/yongzhuo/gemma-sft全部weights要用fp32/tf32, 使用fp16微调十几或几十的步数后大概率lossnan;(即便layer-norm是fp32也不行, LLaMA就没有这个问题, …...
MySQL:数据库中有哪些锁
1、全局锁 加上全局锁后整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞: 对数据的增删改操作,比如 insert、delete、update等语句;对表结构的更改操作,比如 alter table、drop table 等…...
MWC 2024丨美格智能发布全新5G-A模组及FWA解决方案,将5.5G带入现实
2月26日,在MWC 2024世界移动通信大会上,美格智能正式宣布推出5G-A模组SRM817WE以及全新的5G-A FWA解决方案,包含5G-A CPE解决方案SRT858M、5G-A MiFi解决方案SRT878H和5G-A ODU解决方案SRT853MX,旨在进一步提升网络性能࿰…...
Opencv双目校正函数 stereoRectify 详解
目录 函数的[官方解释](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga617b1685d4059c6040827800e72ad2b6)函数原型参数说明:输入参数:输出参数: 函数代码测试 函数的官方解释 函数原型 void cv::stereoRectify ( InputArr…...
实现前端开发几个常用技巧
如何知道iframe下载完成 定时器轮询监听readyState的状态,如果是 complete 或者 interactive 说明文件加载完成。 常用的全屏居中 JS 函数 JS实现deepCopy 生成星级评分 JS数组扁平化之简单方法实现 toString 优点:简单,方便,对…...
Vue3 在SCSS中使用v-bind
template 先创建一个通用的页面结构 <template><div class"v-bubble-bg"></div> </template>js 在JS中先对需要用的数据进行定义: 可以是参数,也可以是data <script setup>const props defineProps({bgCol…...
玩转地下管网三维建模:MagicPipe3D系统
地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进,构建地下管网三维模型与地上融合的数字孪生场景,对于提升智慧城市管理至关重要!针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…...
11.以太网交换机工作原理
目录 一、以太网协议二、以太网交换机原理三、交换机常见问题思考四、同网段数据通信全过程五、跨网段数据通信全过程六、关键知识七、调试命令 前言:在网络中传输数据时需要遵循一些标准,以太网协议定义了数据帧在以太网上的传输标准,了解以…...
【通信基础知识】完整通信系统的流程图及各模块功能详解
2024.2.29 抱歉最近在写毕设大论文,因此没有太多时间更新。然而,在写论文的过程中,发现自己对通信系统的了解还不够全明白,因此差了一些硕博论文总结了一个完整的通信系统流程图。若有不对的地方请多多指正//部分内容有参考ChatGP…...
k8s-项目测试环境部署
部署规划 概述 项目开发好后,我们需要部署,我们接下来就基于 阿里云云效 阿里云容器镜像服务 k8s 搭建部署环境 阿里云云效 : 放代码,可以做cicd(https://www.aliyun.com/product/yunxiao) 阿里云容器镜像服务 :…...
【Elasticsearch管理】缓存机制
文章目录 缓存Field data cache(字段数据缓存)Node query cache(节点查询缓存)Indexing buffer(索引缓冲区)Shard request cache(分片请求缓存)缓存失败启用/禁用缓存根据请求启用/禁…...
JS api基础初学
轮播图随机版 需求:当我们刷新页面,页面中的轮播图会显示不同图片以及样式 分析:①:准备一个数组对象,里面包含详细信息(素材包含) ②:随机选择一个数字,选出数组对应…...
uniapp实战:父子组件传参之子组件数量动态变化
需求说明 现有的设置单元列表,每个带有虚线加号的可以看做是一组设置单元,点击加号可以添加一组设置单元.点击设置单元右上角可以删除对应的设置单元. 实现思路说明 利用数组元素添加或是删除的方式实现页面数量动态变化.由于每个设置单元内容都相同所以单独封装了一个子组件.…...
Ubuntu绑定USB接口到固定端口
绑定端口 打开终端,输入以下命令查看USB端口信息: udevadm info -a -n /dev/ttyUSB0执行后,可以看到部分输出如下: 找到第一个,a-b:c格式的KERNELS,记住这个值,后面会用到。 linlin-B660M-D2H-DDR4:~$ u…...
解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题
解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题 前几天出了教程本地部署gogs,在后期运行时发现两个问题: 第一:邮件明明配置了,后台显示未配置,…...
如何实现视频编辑器的全球化?Kdenlive多语言支持的本地化实践指南
如何实现视频编辑器的全球化?Kdenlive多语言支持的本地化实践指南 【免费下载链接】kdenlive Free and open source video editor, based on MLT Framework and KDE Frameworks 项目地址: https://gitcode.com/gh_mirrors/kd/kdenlive Kdenlive作为一款基于M…...
MUI Treasury卡片组件大全:从产品展示到数据分析的20+应用场景
MUI Treasury卡片组件大全:从产品展示到数据分析的20应用场景 【免费下载链接】mui-treasury A collection of ready-to-use components based on Material-UI 项目地址: https://gitcode.com/gh_mirrors/mu/mui-treasury MUI Treasury是一个基于Material-UI…...
深度解密AI工具破解技术:系统指纹绕过与逆向工程完整指南
深度解密AI工具破解技术:系统指纹绕过与逆向工程完整指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your …...
Pikachu靶场实战:CSRF漏洞攻防全解析
1. CSRF漏洞初探:从原理到危害 第一次听说CSRF漏洞时,我也是一头雾水。这玩意儿到底是怎么把用户给"骗"了的?简单来说,CSRF就像是一个擅长模仿的骗子,它能伪装成你在网站上执行各种操作。想象一下࿰…...
如何在Windows上快速搭建虚拟游戏手柄系统:vJoy完整配置教程
如何在Windows上快速搭建虚拟游戏手柄系统:vJoy完整配置教程 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy 想要在Windows系统上模拟专业游戏控制器,却不想购买昂贵的硬件设备?vJoy虚拟摇…...
手把手教你调试开关电源的双环控制:从电流环PI参数整定到电压环稳定
手把手教你调试开关电源的双环控制:从电流环PI参数整定到电压环稳定 调试开关电源的双环控制系统是硬件工程师的必修课。第一次面对示波器上跳动的波形和密密麻麻的参数表时,多数新手都会感到无从下手。本文将用实验室视角,带你一步步完成从电…...
5分钟快速上手:全平台资源下载神器的完整使用指南
5分钟快速上手:全平台资源下载神器的完整使用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在为无法保存…...
5分钟快速上手:Axure RP中文汉化完整指南与效率提升秘诀
5分钟快速上手:Axure RP中文汉化完整指南与效率提升秘诀 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure…...
从原理图到代码:基于ADS1247与SPI接口的高精度PT100测温实践
1. ADS1247与PT100测温系统概述 第一次接触高精度温度测量项目时,我被PT100传感器的线性度和稳定性所吸引,但很快发现要发挥它的全部性能并不容易。传统方案使用普通ADC配合运放电路,不仅电路复杂,还容易引入噪声。直到发现了TI的…...
思科交换机如何恢复出厂设置?
在实际网络运维中,“恢复出厂设置”并不是一个简单的按钮操作,而是一个涉及系统、配置文件、VLAN数据库甚至安全擦除策略的系统性操作。 无论是在处理网络故障、设备下线,还是接手一台来源不明的交换机,掌握标准、可靠的恢复流程,都是每一位网工的基本功。 很多人以为执行…...
