当前位置:

首页 > 编程开发 > SpringBoot中Ajax跨域及Cookie无法获取丢失问题怎么解决

SpringBoot中Ajax跨域及Cookie无法获取丢失问题怎么解决

在写自己项目的登录注册页面时,因为我的注册和更改密码功能采用了邮箱验证,在发送验证码的时候后端会向响应数据中添加一个cookieCookiecookie=newCookie(toEmail.split("@")[0],verCode);cookie.setMaxAge(30*60);response.addCookie(cookie);然后在点击注册或更改密码时,后端会从请求中获取Cookie获得邮箱与验证码信息Cookie[]cookies=request.getCookies();在本地进行测试时,C

在写自己项目的登录注册页面时, 因为我的注册和更改密码功能采用了邮箱验证, 在发送验证码的时候后端会向响应数据中添加一个cookie

Cookie cookie = new Cookie(toEmail.split("@")[0],verCode);
cookie.setMaxAge(30*60);
response.addCookie(cookie);

然后在点击注册或更改密码时, 后端会从请求中获取Cookie获得邮箱与验证码信息

Cookie[] cookies = request.getCookies();

在本地进行测试时, Cookie能正确添加进响应中, 也能正确获取

SpringBoot中Ajax跨域及Cookie无法获取丢失问题怎么解决

SpringBoot中Ajax跨域及Cookie无法获取丢失问题怎么解决

但是在把项目打包上云, 再进行ajax访问时就出现了问题, Cookie获取失败了!

再响应标头中分明有set-Cookie, 但是再第二次的请求标头中却找不到Cookie

服务端获取cookie失败报错, 注册和更改密码需要使用Cookie的功能失效, 在查找文档后发现错误来源于springboot和ajax的跨域cookie丢失问题, 由于我是刚接触后端的小白,

这里只贴出我的解决方案

1. ajax请求中 需要携带上   xmlhttp.withCredentials = true;         

var xmlhttp = new XMLHttpRequest();
xmlhttp.withCredentials = true;
xmlhttp.open("GET", readyUrl, true);
xmlhttp.send();

2. 添加 corsConfig 配置类(这一步可能是化蛇填足,欢迎找茬)

package com.crisp.myblog.config;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 
@Configuration
public class corsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOriginPatterns("这里填你前端代码所在的域名:端口")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

3. 给Controller中的api中的response设置响应头,为"Access-Control-Allow-Origin" 访问控制允许来源,http请求头信息,设定允许资源共享(跨域)的源 

response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));

为 request.getHeader("Origin"), 表示当前请求资源所在页面的协议和域名

组合在一起表示 允许当前请求资源跨域访问后端资源

这三部均设置好后我就能够重新获取到cookie了

2022-12-09 更新内容:

发现了更加简洁方便的方法, 添加跨域请求过滤器

用到了德鲁伊数据池依赖包的StringUtils.isEmpty 方法, 报错了的话自己写一个替换就行

import com.alibaba.druid.util.StringUtils;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
 
@Component
public class crispFilter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        System.out.println("跨域请求过滤器启动");
        if (request.getRequestURL().toString().matches(".+.ico$")) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            String origin = request.getHeader("Origin");
            // 简单请求跨域,如果是跨域请求在响应头里面添加对应的Origin
            if (!StringUtils.isEmpty(origin)) {
                response.addHeader("Access-Control-Allow-Origin", origin);
            }
            // 非简单请求跨域
            response.addHeader("Access-Control-Allow-Headers", "content-type");
            // 允许跨域请求的方法
            response.addHeader("Access-Control-Allow-Methods", "*");
            // 携带cookie的跨域
            response.addHeader("Access-Control-Allow-Credentials", "true");
 
            // 放行方法
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
 
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
谷歌浏览器Mac版入口
谷歌浏览器Mac版入口

谷歌浏览器Mac版官方安装指南 谷歌浏览器Mac版官方安装入口是https://www.google.com/chrome/,需macOS 12+系统、500MB空间,下载.dmg后拖入应用程序安装,支持多设备同步、性能优化与隐私保护功能。 苹果电脑Chrome的安装入口究竟在哪里?这个问题最近可是

vivo浏览器最新官方网站链接
vivo浏览器最新官方网站链接

vivo浏览器官方入口与核心体验全解析 很多用户都在寻找vivo浏览器的最新官方入口。别急,关于其网页版如何直接访问,以及它能带来怎样的体验,咱们这就来详细聊聊。 它的最新官方网站链接是:https://browser.vivo.com.cn。记住这个地址,就能直达核心。 平台核心功能介绍 首先,来

夸克浏览器登录异常怎么办
夸克浏览器登录异常怎么办

网络不稳、缓存堆积或是账号安全机制触发,都可能是夸克登录异常的“元凶”。别急,顺着网络、缓存和权限这几条线排查下来,绝大多数情况都能快速搞定。 当夸克浏览器突然“拒签”,登录按钮怎么点都没反应时,别先怪手速。这事儿多半出在几个最常见的环节上。咱们按顺序来,从外到内捋一遍,问题往往就迎刃而解了。 检查

百度浏览器如何清除浏览器历史记录
百度浏览器如何清除浏览器历史记录

百度浏览器历史记录清理全指南 很多朋友在用百度浏览器时,都想把上网痕迹清理干净,但可能不太清楚具体从哪里下手。这通常是因为历史记录没有主动去清理。其实,方法很全面,涵盖了从电脑端、手机App到云端账户的各个层面。 如果您在使用百度浏览器时希望移除已保存的访问痕迹,但不确定具体操作路径,则可能是由于历

IE浏览器怀旧版在线网址
IE浏览器怀旧版在线网址

IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

Safari浏览器如何清除缓存和历史记录
Safari浏览器如何清除缓存和历史记录

Safari浏览器的缓存清理指南:五种方法应对不同场景 不知道你有没有遇到过这样的情况:用Safari打开网页,要么加载慢得像蜗牛,要么排版错乱,甚至刚刚登录的账号莫名其妙就掉线了。很多时候,这些问题背后的“元凶”并不是网络,而是浏览器里积压已久的缓存文件和历史记录在“作祟”。今天咱们就来系统盘一盘

火车头采集器如何使用Cookie进行登录
火车头采集器如何使用Cookie进行登录

火车头采集器登录需正确配置cookie:一、浏览器提取有效cookie;二、任务中设自定义cookie请求头;三、内置浏览器自动捕获;四、发布模块复用cookie;五、fiddler截获复杂登录cookie。 在使用火车头采集器抓取需要登录才能访问的页面时,如果总是跳回到登录页,或者看到一片空白甚至

AO3最新镜像入口 | 2025稳定访问Archive of Our Own官网
AO3最新镜像入口 | 2025稳定访问Archive of Our Own官网

AO3最新镜像入口 | 2025稳定访问Archive of Our Own官网 AO3官方唯一网址为archiveofourown.org,建议直接输入访问并添加书签防走失,镜像站如ao3.cubeart.club可作备用,但应优先使用官网以确保安全。 如何稳定访问Archive of Our O

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。