Java跨域问题

news2024/11/15 21:42:26

目录

1、跨域问题说明

​2、跨域解决方案

2.1、局部跨域解决方案

2.1.1、@CrossOrigin注解跨域

2.1.2、手动设置响应头

2.2、全局跨域解决方案

2.2.1、实现WebMvcConfigurer接口设置跨域

2.2.2、定义CorsFilter Bean实现跨域

2.2.3、重写ResponseBodyAdvice接口中的beforeBodyWrite方法实现跨域

2.2.4、nginx配置跨域(nginx.conf)

3、跨域常见异常问题

3.1、No 'Access-Control-Allow-Origin' header is present on the requested resource

3.2、header contains multiple values 'XXX, *', but only one is allowed


1、跨域问题说明

  • 同源:两个页面具有相同的协议、域名和端口。
  • 跨域:当一个请求url的协议、域名或端口之中任意一个与当前页面url不同。
  • 跨域产生原因:浏览器设置了同源策略,当页面执行脚本的时候,浏览器会检查访问的资源是否同源,如果不是,就会报错。

举例说明:


2、跨域解决方案

        通过在响应头中设置Access-Control-Allow-Origin,表示允许跨域访问的原始域名,告诉浏览器这是一个安全请求,即可解决跨域问题。

        当设置Access-Control-Allow-Origin = * 时,表示允许所有站点跨域访问。

2.1、局部跨域解决方案

2.1.1、@CrossOrigin注解跨域

该注解可以修饰类和方法。设置简单,但需要为所有类或方法都加上注解。

@RestController
@CrossOrigin(origins = "*")
public class TestController {
    @RequestMapping("/test")
    public String test() {
        return "测试@CrossOrigin解决跨域问题";
    }
}

2.1.2、手动设置响应头

        方法级别的跨域。

@RestController
public class TestController {
    @RequestMapping("/test")
    public String test(HttpServletResponse response) {
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Max-Age", "10");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        
        return "测试手动设置响应头解决跨域问题";
    }
}

2.2、全局跨域解决方案

2.2.1、实现WebMvcConfigurer接口设置跨域

        通过实现WebMvcConfigurer接口里的addCorsMappings方法设置跨域。

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")             // 匹配所有接口
                .allowCredentials(true)     // 是否发送 Cookie
                .allowedOriginPatterns("*") // 支持域
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

2.2.2、定义CorsFilter Bean实现跨域

@Configuration
public class MyCorsFilter {
    @Bean
    public CorsFilter corsFilter() {
        // 1.创建 CORS 配置对象
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOriginPattern("*");                // 支持域
        config.setAllowCredentials(true);                    // 是否发送 Cookie
        config.addAllowedMethod("*");                        // 支持请求方式
        config.addAllowedHeader("*");                        // 允许的原始请求头部信息
        config.addExposedHeader("*");                        // 暴露的头部信息
        
        // 2.添加地址映射
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**", config);
        
        // 3.返回 CorsFilter 对象
        return new CorsFilter(corsConfigurationSource);
    }
}

2.2.3、重写ResponseBodyAdvice接口中的beforeBodyWrite方法实现跨域

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    /**
     * 是否重写响应内容
     * 返回 true 表示重写
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
    /**
     * 方法返回之前调用此方法
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request,
                                  ServerHttpResponse response) {
        // 设置跨域
        response.getHeaders().set("Access-Control-Allow-Origin", "*");
        return body;
    }
}

2.2.4、nginx配置跨域(nginx.conf)

        nginx在获取下游响应后,在响应头中加上如下配置:

add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Credentials 'true' always;
add_header Access-Control-Allow-Headers * always;
add_header Access-Control-Allow-Methods 'PUT, GET, POST, DELETE, OPTIONS' always;
if ($request_method = 'OPTIONS') {
    return 204;
}

3、跨域常见异常问题

3.1、No 'Access-Control-Allow-Origin' header is present on the requested resource

        XXXX from origin XXXX has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource

  • 原因:响应结果未增加Access-Control-Allow-Origin头。
  • 解决方案:后端解决方案可参照《2、跨域解决方案》。

3.2、header contains multiple values 'XXX, *', but only one is allowed

        The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:8080, *', but only one is allowed. Origin 'http://localhost:8080' is therefore not allowed access.

  • 原因:跨域重复设置,比如在nginx设置了跨域,又在业务服务中设置了跨域,最后的响应中就会有多个Access-Control-Allow-Origin值。
  • 解决方案:请求全流程保证只进行一次跨域设置即可。

以上内容为个人学习理解,如有问题,欢迎在评论区指出。

部分内容截取自网络,如有侵权,联系作者删除。

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

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

相关文章

ros的launch文件知识

_node标签: 在指定机器上启动节点respawn"true|false"(可选) 如果节点退出,是否自动重启respawndelay"N"(可选) 如果 respawn 为 true,那么延迟N秒后启动节点required"true|false"(可选) 该节点是否必须,如果…

ZooKeeper 避坑实践:SnapCount 设置不合理导致磁盘爆满,服务不可用

作者:子葵 背景 在 ZooKeeper 的日常使用过程中,一个令人头疼的问题就是节点的磁盘容量问题,如果由于过大的 TPS 或者不适当的清理策略会导致集群中数据文件,日志文件的堆积,最终导致磁盘爆满,Server 宕机…

在线客服系统部署配置邮箱消息通知功能 - 唯一客服(v1kf.com) -开源私有化独立部署在线客服系统源码...

为在线客服系统设置邮件通知具有以下几个好处: 改善客户体验:邮件通知可以让客户实时收到新消息或更新通知,这有助于提高他们对您的服务的整体体验。 提高效率:邮件通知可以帮助提高客服团队的效率,因为它们会在新消息…

非专业人士如何完成数据采集?纯干货,一文看懂

写在前面: 本教程能够解决大部分人的数据采集及分析需求,实用、简单,尤其适合Excel大户、办公族、业务人员,或者不会编程、不懂数据分析理论的技术小白…… 来不及看的可以先点赞收藏! 01 点对点的采集:…

吴恩达《机器学习》——欠拟合与过拟合

欠拟合与过拟合1. 方差与偏差模型的容量、过拟合和欠拟合2. Python代码实践2.1 拟合直线2.2 拟合多项式数据集、源文件可以在Github项目中获得 链接: https://github.com/Raymond-Yang-2001/AndrewNg-Machine-Learing-Homework 1. 方差与偏差 在数学上,估计的偏差…

Java基础漏洞(二)

继续填补自己的知识漏洞 1.&、&&、|、||之间的区别 &是逻辑与,而&&则是短路与。&和&&之间的区别是,在短路与&&的情况下,两个条件当第一个条件为假时,则不再执行第二个条件&#xf…

java学习之类方法

目录 一、基本介绍 二、类方法的调用 三、类方法的应用实例 代码 内存分析 运行结果 四、类方法的经典使用场景 五、类方法使用细节 第一条 第二条 第三条 第四条 第五条 第六条 六、练习 第一题 考察点 分析 结果 第二题 代码 考察点 结果 第三题 类方法 …

LeetCode498. 对角线遍历

LeetCode刷题记录 文章目录📜题目描述💡解题思路⌨C代码📜题目描述 给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。 示例1 输入:mat [[1,2,3],[4,5,6],[…

VUE2使用浏览器缓存的方法

分两种:localStorage和sessionStorage,它两统称webStorage 注意点1:localStorage对象和sessionStorage对象都是window对象下的,且方法都是一样的,默认”window.”可以省略,添加可用setItem(K,V),查询可用ge…

数据库|scMethBank:单细胞全基因组 DNA 甲基化图谱数据库

甲基化是DNA的一种重要化学修饰,可调节基因的表达和关闭,与癌症、衰老、老年痴呆等许多疾病密切相关,是表观遗传学的重要研究内容之一。测序技术的发展,极大促进了单细胞DNA甲基化研究。然而大量数据的不断积累,对单细…

《HTTP权威指南》----HTTP报文

目录 报文流 报文的组成部分 报文语法 1.起始行 2.首部 通用首部,既可以出现在请求报文中也可以出现在响应报文中。 请求首部,提供更多有关请求的信息。 响应首部,提供更多有关响应的信息。 实体首部,描述主题的长度和内…

2022年,一个技术账号的年终独白,满篇都写着2个字:真难。

2022年,梦想橡皮擦这个账号经历了成长,突破,回归 2023年,适应改变 文章目录序2022年,梦想橡皮擦账号整体汇总原创博客KPI计划与完成总排名KPI计划与完成2022年,橡皮擦获得的荣誉2022年,做技术博…

日志收集系统架构

背景 应用服务器多,日志文件被分散在各个应用服务器上,需要依次登录每台设备才能查看日志,效率低下,且不利于服务器安全管控,加大生产服务器的风险;日志文件不统一,各项目日志没有统一的规范&a…

Python Django教程之实现天气应用程序

基本设置 将目录更改为天气 cd weather启动服务器 python manage.py runserver要检查服务器是否正在运行,请转到 Web 浏览器并输入为 URL。现在,您可以通过按以下命令停止服务器http://127.0.0.1:8000/ ctrl-c 实现 python manage.py startapp main…

Vehicle Speed Forecasting Based On GCN-LSTM Combined Model

GCN-LSTM模型预测道路交通车辆速度 Vehicle Speed Forecasting Based On GCN-LSTM Combined Model Summary This research offers a multistep traffic flow forecasting framework relying on interest spatial-temporal-graph neural network-long short-term memory neura…

【阅读】《MYSQL技术内幕:innodb》索引

概念 索引的类型 聚集索引:叶子节点包含行记录的全部数据辅助索引:叶子节点不包含行记录的全部数据,除了键值以外,还包含指向索引行的书签。 堆表和索引组织表 堆表 无论是主键索引还是普通索引都是辅助索引。数据是按照插入…

​力扣解法汇总2042. 检查句子中的数字是否递增

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 句子是由若干 token 组成的一个列表,token 间用 单个 空格分隔&…

微信小程序实战十五:Https服务搭建及Nginx配置

文章目录 1.最终效果预览2.后端jar包部署及启动3.前端管理系统部署4.Nginx的配置5.https证书申请6.小程序后台中配置子域名这篇文章重点介绍下微信小程序正式版上线前https服务的搭建及配置过程,之前整个流程都操作过,时隔一年再次从零开始操作有些地方的印象已经模糊了,好记…

Java Swing五子棋项目

一、项目简介 本项目为Java Swing五子棋项目,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse 确保可…

ArcGIS基础实验操作100例--实验50以栅格分区裁剪面要素

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验50 以栅格分区裁剪面要素 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…