第一百一十期:详解SpringBoot应用跨域访问解决方案

说到跨域访问,必须先解释一个名词:同源策略。所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同、Host(ip)相同、端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问。

作者:佚名

一、什么是跨域访问

说到跨域访问,必须先解释一个名词:同源策略。所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同、Host(ip)相同、端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问。

虽然跨域访问被禁止之后,可以在一定程度上提高了应用的安全性,但也为开发带来了一定的麻烦。比如:我们开发一个前后端分离的易用,页面及js部署在一个主机的nginx服务中,后端接口部署在一个tomcat应用容器中,当前端向后端发起请求的时候一定是不符合同源策略的,也就无法访问。那么我们如何解决这个问题?就是本文需要向大家说明的内容。

二、跨域访问的解决方案有哪些?

2.1.第一类方案:前端解决方案

虽然浏览器对于不符合同源策略的访问是禁止的,但是仍然存在例外的情况,如以下资源引用的标签不受同源策略的限制:

  • html的script标签
  • html的link标签
  • html的img标签
  • html的iframe标签:对于使用jsp、freemarker开发的项目,这是实现跨域访问最常见的方法,

除了基于HTML本身的特性实现跨域访问,我们还可以使用jsonp、window的postMessage实现跨域访问。这些都是前端实现跨域访问的方式。

2.2.第二类方案:使用代理

实际上对跨域访问的支持在服务端实现起来更加容易,最常用的方法就是通过代理的方式,如:

  • nginx或haproxy代理跨域
  • nodejs中间件代理跨域

其实实现代理跨域的逻辑非常简单:就是在不同的资源服务:js资源、html资源、css资源、接口数据资源服务的前端搭建一个中间层,所有的浏览器及客户端访问都通过代理转发。所以在浏览器、客户端看来,它们访问的都是同一个ip、同一个端口的资源,从而符合同源策略实现跨域访问。

2.3 第三类方案:CORS

跨域资源共享(CORS):通过修改Http协议header的方式,实现跨域。说的简单点就是,通过设置HTTP的响应头信息,告知浏览器哪些情况在不符合同源策略的条件下也可以跨域访问,浏览器通过解析Http协议中的Header执行具体判断。具体的Header如下:

CROS跨域常用header

  • Access-Control-Allow-Origin: 允许哪些ip或域名可以跨域访问
  • Access-Control-Max-Age: 表示在多少秒之内不需要重复校验该请求的跨域访问权限
  • Access-Control-Allow-Methods: 表示允许跨域请求的HTTP方法,如:GET,POST,PUT,DELETE
  • Access-Control-Allow-Headers: 表示访问请求中允许携带哪些Header信息,如: Accept 、 Accept-Language 、 Content-Language 、 Content-Type

三、SpringBoot下实现CORS的四种方式

为大家介绍四种实现CORS的方法,两种是全局配置,两种是局部接口生效的配置。一般来说,SpringBoot项目采用其中一种方式实现CORS即可。

3.1.使用CorsFilter进行全局跨域配置

@Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); //开放哪些ip、端口、域名的访问权限,星号表示开放所有域 config.addAllowedOrigin("*"); //是否允许发送Cookie信息 config.setAllowCredentials(true); //开放哪些Http方法,允许跨域访问 config.addAllowedMethod("GET","POST", "PUT", "DELETE"); //允许HTTP请求中的携带哪些Header信息 config.addAllowedHeader("*"); //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) config.addExposedHeader("*"); //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置 UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); return new CorsFilter(configSource); } } 

3.2. 重写WebMvcConfigurer的addCorsMappings方法(全局跨域配置)

@Configuration public class GlobalCorsConfig { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**")    //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置 .allowedOrigins("*")    //开放哪些ip、端口、域名的访问权限 .allowCredentials(true)  //是否允许发送Cookie信息  .allowedMethods("GET","POST", "PUT", "DELETE")     //开放哪些Http方法,允许跨域访问 .allowedHeaders("*")     //允许HTTP请求中的携带哪些Header信息 .exposedHeaders("*");   //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息) } }; } } 

3.3.使用CrossOrigin注解(局部跨域配置)

    将CrossOrigin注解加在Controller层的方法上,该方法定义的RequestMapping端点将支持跨域访问将CrossOrigin注解加在Controller层的类定义处,整个类所有的方法对应的RequestMapping端点都将支持跨域访问@RequestMapping("/cors") @ResponseBody @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)  public String cors( ){ return "cors"; } 

3.4 使用HttpServletResponse设置响应头(局部跨域配置)

这种方式略显麻烦,不建议在SpringBoot项目中使用。

@RequestMapping("/cors") @ResponseBody public String cors(HttpServletResponse response){ //使用HttpServletResponse定义HTTP请求头,最原始的方法也是最通用的方法 response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080"); return "cors"; } 

四、实现与测试

在SpringBoot 项目外 随便定义一个HTML,并写代码触发如下的ajax代码。(触发过程我就不写了,定义一个按钮加一个监听函数即可)。以下是跨域AJAX请求验证的核心代码:

$.ajax({ url: 'http://localhost:8090/cors', type: "POST", xhrFields: { withCredentials: true    //允许发送Cookie信息 }, success: function (data) { alert("跨域请求配置成功") }, error: function (data) { alert("跨域请求配置失败") } }) 
  • 跨域请求配置成功表示:我们的跨域配置生效,ajax请求可以正确访问服务端接口。
  • 跨域请求配置失败表示:我们的跨域配置未生效,请参照检查第三节检查各项配置是否正确。
  • 阅读目录(置顶)(长期更新计算机领域知识)

    阅读目录(置顶)(长期更新计算机领域知识)

    阅读目录(置顶)(长期科技领域知识)

    歌谣带你看java面试题

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

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

相关文章

【REPERTOIRE】Rastaman Vibration

上周四的晚上跟项目里的同事一起去吃饭,去的是城外面一个叫Aussonne小镇上的Restaurant du Lac,左近真的有个湖。 当晚又充分体现了法国人吃晚饭的功夫,我们到凌晨一点才回城,接下来的几天昏昏沉沉,用了周末才恢复&…

63. Unique Paths II and 64. Minimum Path Sum

文章目录1 63 Unique Paths II1.1 题目描述1.2 动态规划解决2 64. Minimum Path Sum2.1 题目理解2.2 动态规划这一遍刷dp的题目就很轻松了。1 63 Unique Paths II 1.1 题目描述 A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram…

LCA模板(数剖实现)

题目链接:https://www.luogu.org/problemnew/show/P3379 题意:LCA模板题。 思路:今天开始学树剖,先拿lca练练。树剖解lca,两次dfs复杂度均为O(n),每次查询为logn,因此总复杂度为:O(2…

spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题

eclipse里第一次创建Maven项目时,src/main/java与src/test/java目录都不会出现,这是因为eclipse里的一个默认配置。这两个目录是真实存在的,只是隐藏了。 这时候想要让这两个目录出现,就需要修改以下配置: 右击项目-…

Servlet技术简介与编写、编译Servlet程序

1.Servlet技术简介Servlet技术是Sun公司提供的一种实现动态网页的解决方案,它是基于Java编程语言的WEB服务器端编程技术,主要用于在WEB服务器端获得客户端的访问请求信息和动态生成对客户端的响应消息。Servlet技术也是JSP技术(另…

spring mvc学习(24):配置maven环境和创建maven项目(建议收藏,超全超详细)

1本次歌谣就对如何创建一个maven项目做一个详细的讲解,毕竟卡了我三天,久久不能入眠,也搜了网上很多的博客 都没有顺利的解决maven项目的创建。这篇建议大家收藏,总会用到的。不然大家看网上的博客也是一脸懵逼。 2首先工具使用…

120. Triangle

文章目录1 题目理解2 解题2.1 动态规划2.2 优化空间2.3进一步优化空间1 题目理解 Given a triangle array, return the minimum path sum from top to bottom. For each step, you may move to an adjacent number on the row below. 输入&#xff1a;一个三角形数组List<…

Torque2D MIT 实战记录: 塔防进度(1)

前言 Torque2D虽然工具不齐全,而且加入MIT不久,但是有老底在,所以即使是第一版也是非常好用和完善的,这几天准备开发一款塔防类的游戏. :) 熟悉了TorqueScript的用法后,写东西还是很快的. 进度 1. 完成了道具库模块 2. 场景系统 3. 阵营逻辑 4. 攻击系统雏形 截图 效果还不错吧…

三十岁前不要去在乎的18件事

1&#xff0e;放弃 把握的反面就是放弃&#xff0c;选择了一个机会&#xff0c;就等于放弃了其它所有的可能。当新的机会摆在面前的时候&#xff0c;敢于放弃已经获得的一切&#xff0c;这不是功亏一篑&#xff0c;这不是半途而废&#xff0c;这是为了谋求更大的发展空间&#…

第一百一十一期:思考 | 一文说透秒杀系统如何设计

秒杀大家都不陌生。自2011年首次出现以来&#xff0c;无论是双十一购物还是 12306 抢票&#xff0c;秒杀场景已随处可见。简单来说&#xff0c;秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看&#xff0c;秒杀系统本质是一个高性能、高一致、高可…

TcpClient.Connect函数连接超时的问题(转载)

TcpClient.Connect函数连接超时的问题 问题原述&#xff1a; http://topic.csdn.net/t/20060616/15/4825920.html 调用TcpClient.Connect函数连接其他机器。我在一台机器上测试程序&#xff0c;对于连接根本无法连接&#xff08;物理连接不通&#xff09;的机器&#xff0c;该函…

Programming MS Office 2000 Web Components第二章第一节(第二部分)

排序和过滤 阅读本节时&#xff0c;如果您打开随书光盘Samples\Chap02目录下的SortFilterExample.htm文件。您会发现这个例子很有用。本节展示的代码和描述的特定环境来自这个文件。 电子表格组件支持Excel中的基础的排序和过滤功能&#xff0c;并且通过编程模型和用户界面来提…

309. Best Time to Buy and Sell Stock with Cooldown

1 题目理解 Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple tim…

第一百一十二期:96秒100亿!如何抗住双11高并发流量?

今年双 11 全民购物狂欢节进入第十一个年头&#xff0c;1 分 36 秒&#xff0c;交易额冲到 100 亿 !比 2018 年快了近 30 秒&#xff0c;比 2017 年快了近 1 分半!这个速度再次刷新天猫双 11 成交总额破 100 亿的纪录。 作者&#xff1a;邴越 今年双 11 全民购物狂欢节进入第…

不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

Python爬虫为什么受欢迎如果你仔细观察&#xff0c;就不难发现&#xff0c;懂爬虫、学习爬虫的人越来越多&#xff0c;一方面&#xff0c;互联网可以获取的数据越来越多&#xff0c;另一方面&#xff0c;像 Python这样的编程语言提供越来越多的优秀工具&#xff0c;让爬虫变得简…

股票

FXCM - 网路外汇交易 http://www.fxcmasia.com/chinese/转载于:https://www.cnblogs.com/snowball/archive/2006/06/26/436446.html

740. Delete and Earn

1 题目 Given an array nums of integers, you can perform operations on the array. In each operation, you pick any nums[i] and delete it to earn nums[i] points. After, you must delete every element equal to nums[i] - 1 or nums[i] 1. You start with 0 poin…

第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?

区块链技术仍然在发展初期&#xff0c;实践应用也停留在试水阶段。就金融等领域而言&#xff0c;区块链究竟意味着什么?今后实践应用的前景何在?在Libra的倒逼下&#xff0c;全球央行数字货币又将如何发展? 作者&#xff1a;第一财经 两周前&#xff0c;区块链成为热词。上…

两种战斗

两种战斗 Written by Allen Lee 战斗分两种&#xff0c;我们一定要把它们分开&#xff0c;就是为了维持生命的战斗&#xff0c;和为了维持自尊的战斗。 如果你无法分清的话&#xff0c;要么你将致使他失去生命。要么你将致使他失去自尊。“你要是现在去帮忙的话&#xff0c;或…

地图图元的闪烁效果制作

实现查找之后如果加上一个闪烁效果会更明显&#xff0c;方法是用个时间控件控制&#xff0c;改变vstyle即可&#xff1b;还可以简单的设置进程休眠时间&#xff0c;改变可视性&#xff0c;利用一个循环&#xff0c;控制闪烁次数。前面一种实现代码如下&#xff1a; 用个时间控件…