当前位置:

首页 > 编程开发 > 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();
        }
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    谷歌浏览器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

    夸克手机版设置启用阻止第三方cookie功能的方法
    夸克手机版设置启用阻止第三方cookie功能的方法

    夸克APP在很多人眼里可能只是个网盘或浏览器,但用久了你会发现,它其实是个挺全能的工具——既能存文件、又能看网页,手机和电脑都能用,工作文档、学习资料放进去还挺安心。不过,长期使用下来,有个隐患容易被忽略:那些第三方网站可能会通过Cookie悄悄跟踪你的浏览行为,影响隐私安全。要防范这类风险,其实很

    小k浏览器手机版如何一键清除cookie和网站数据
    小k浏览器手机版如何一键清除cookie和网站数据

    用手机浏览器时,清理cookie和网站数据算是比较常见的操作——要么是为了保护隐私,要么是解决某些网站突然抽风的问题,当然也可能是想腾出点存储空间。下面就把小k浏览器手机版一键清除的方法说清楚,跟着走就行。 先打开小k浏览器,进入主界面后,找到屏幕下方的菜单图标。这个图标通常长什么样?一般是三条横线

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。