Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot跨域配置

SpringBoot跨域配置

作者头像
小沐沐吖
发布于 2022-09-22 07:29:12
发布于 2022-09-22 07:29:12
1.3K00
代码可运行
举报
文章被收录于专栏:小沐沐吖小沐沐吖
运行总次数:0
代码可运行

SpringBoot跨域配置

什么是跨域

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。

例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!

同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;

一、同源策略

  1. 同源,就是咱们域名、端口号、ip、采用的协议都相同,那么我们就是同源的
  2. 反之就是不同源的!!!
  3. 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
  4. 所以,用最简单的话来说,就是前端可以发请求给服务器,服务器也可以进行响应,只是因为浏览器会对请求头进行判断,所以要么前端设置请求头,要么后端设置请求头

不同源的应用场景:

  1. 本地文件,向远程服务器发送请求,可以发送,但是会出现跨域
  2. 本地服务器跑前端文件,服务器跑服务器程序,也会出现跨域问题

二、跨域问题

axios发起的POST请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Access to XMLHttpRequest at 'http://localhost:8080/login' from origin 'http://localhost:8081' 
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' 
header is present on the requested resource.

// 在'http://localhost:8080/login'从原点'http://localhost:8081'已被CORS策略阻止:
// 请求的资源上不存在“Access Control Allow Origin”标头

POST http://localhost:8080/login net::ERR_FAILED 200

Uncaught (in promise) AxiosError 
{
    message: 'Network Error', 
    name: 'AxiosError', 
    code: 'ERR_NETWORK', 
    config: {}, 
    request: XMLHttpRequest,
    ......
}

三、后端解决CORS跨域

对于 CORS的跨域请求,主要有以下几种方式可供选择:

  1. 返回新的CorsFilter
  2. 重写WebMvcConfigurer
  3. 使用注解@CrossOrigin
  4. 手动设置响应头 (HttpServletResponse)
  5. 自定webfilter实现跨域

注意:

  • CorFilterWebMvConfigurer@CrossOrigin需要SpringMVC 4.2以上版本才支持,对应springBoot 1.3版本以上
  • 上面前两种方式属于全局 CORS 配置,后两种属于局部 CORS配置。
  • 如果使用了局部跨域是会覆盖全局跨域的规则,所以可以通过@CrossOrigin 注解来进行细粒度更高的跨域资源控制。
  • 其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域

所有解决跨域问题,不外乎就是解决浏览器拦截问题,要么前端设置请求头,要么后端设置请求头,无论谁设置请求头,浏览器只要放行即可

四、全局跨域

1、配置新的CorsFilter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 全局跨域配置
 */
@Configuration
public class GlobalCorsConfig {

    @Bean
    public CorsFilter corsFilter(){
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        // springboot 2.4.0 之前使用这个 或直接指定放行的域名http://localhost:8081...
        // config.addAllowedOrigin("*"); 
        config.addAllowedOriginPattern("*"); // springboot 2.4.0 之后使用这个
        // 是否发送 Cookie
        config.setAllowCredentials(true);
        // 放行哪些请求方式
        config.addAllowedMethod("*");
        // 放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        // 暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(source);
    }
}

2、重写WebMvcConfigurer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.jetbrains.annotations.NotNull;
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 GlobalCorsConfig implements WebMvcConfigurer{
    @Override
    public void addCorsMappings(@NotNull CorsRegistry registry) {
        registry.addMapping("/**")
                // 是否发送cookie
                .allowCredentials(true)
                // 放行哪些域名
                // springboot 2.4.0 之前使用这个 或直接指定放行的域名http://localhost:8081...
                // .allowedOrigins("*")
                .allowedOriginPatterns("*") // springboot 2.4.0 之后使用这个
                // 允许任何方法
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                // 允许任何请求头
                .allowedHeaders("*")
                .exposedHeaders("*")
                // 表明在3600秒内,不需要再发送预检验请求
                .maxAge(3600L)
        ;
    }
}

五、局部跨域

1、注解

在springboot2.x版本以后,点开注解源码可以看到credentials默认是关闭的,该值是一个布尔值,表示是否允许发送 Cookie 。默认情况下, Cookie 不包括在 CORS 请求之中,设置为 true,即表示服务器明确许可, Cookie 可以包含中跨域请求中,一起发送给服务器。这个值也只能设置为 true ,如果服务器不要浏览器发送 Cookie,删除该字段即可。 在1.x版本的springboot中,是以origins作为参数,而新版本则改为了originPatterns 在控制器(类上)上使用注解 @CrossOrigin:,表示该类的所有方法允许跨域

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@CrossOrigin(originPatterns = "*",allowCredentials = "true")
public class LoginController {
    ...
}

在方法上使用注解 @CrossOrigin:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApiOperation(value = "登录")
@PostMapping("login")
@CrossOrigin(originPatterns = "*",allowCredentials = "true")
public RespBean login(@RequestBody LoginVo loginVo, HttpServletRequest request){
    if (!CaptchaUtil.ver(loginVo.getCode(),request)){
        return RespBean.loginCode();
    }
    CaptchaUtil.clear(request);
    return loginService.login(loginVo.getUsername(), loginVo.getPassword());
}

2、手动设置响应头

控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ApiOperation(value = "登录")
@PostMapping("login")
public RespBean login(HttpServletRequest request,HttpServletResponse response){
    // 调用cors工具类
    CorsUtilks.cors(request,response);
    ...
    return loginService.login(loginVo.getUsername(), loginVo.getPassword());
}

Cors工具类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 手动设置响应头
 */
public class CorsUtilks {
    public static void cors(HttpServletRequest request, HttpServletResponse response){
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 设置允许所有跨域访问
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization,token");
        response.setHeader("Access-Control-Allow-Credentials", "true");
    }
}

六、自定义filter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 自定义filter实现跨域
 */
@Component
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 设置允许所有跨域访问
        response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization,token");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig){}

    @Override
    public void destroy() {}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022 年 08 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hbase源码系列之BufferedMutator的Demo和源码解析
一,基本介绍 BufferedMutator主要用来异步批量的将数据写入一个hbase表,就像Htable一样。通过Connection获取一个实例。Map/reduce 任务是BufferedMutator的好的使用案例。Map/Reduce任务获益于batch操作,但是没有留出flush接口。BufferedMutator从Map/Reduce任务接受数据,会依据一些先验性的经验批量提交数据,比如puts堆积的数量,由于批量提交时异步的,所以M/R逻辑不会因为数据的batch提交而阻塞。Map/Redu
Spark学习技巧
2018/01/30
4.1K1
Hbase源码系列之BufferedMutator的Demo和源码解析
hbase源码系列(二)HTable 探秘
  hbase的源码终于搞一个段落了,在接下来的一个月,着重于把看过的源码提炼一下,对一些有意思的主题进行分享一下。继上一篇讲了负载均衡之后,这一篇我们从client开始讲吧,从client到master再到region server,按照这个顺序来开展,网友也可以对自己感兴趣的部分给我留言或者直接联系我的QQ。   现在我们讲一下HTable吧,为什么讲HTable,因为这是我们最常见的一个类,这是我们对hbase中数据的操作的入口。 1.Put操作   下面是一个很简单往hbase插入一条记录的例子。
岑玉海
2018/03/01
2.2K0
一篇文章完成Hbase入门
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map(多维地图)
ha_lydms
2023/11/26
1.5K0
一篇文章完成Hbase入门
HBase篇--HBase常用优化
HBase优化能够让我们对调优有一定的理解,当然企业并不是所有的优化全都用,优化还要根据业务具体实施。
LhWorld哥陪你聊算法
2018/09/13
6.1K0
科学使用HBase Connection
这个问题的答案简单而不简单:HBase客户端是不需要维护连接池的,或者说,Connection对象已经帮我们做好了。但是,对Connection使用不当是HBase新手(包括很久很久之前的我自己)最容易犯的错误之一,常见错误用法有:
大数据真好玩
2019/09/02
4.2K0
科学使用HBase Connection
【大数据技术基础 | 实验八】HBase实验:新建HBase表
通过Java代码实现与HBase数据库连接,然后用Java API创建HBase表,向创建的表中写数据,最后将表中数据读取出来并展示。
Francek Chen
2025/01/22
5560
【大数据技术基础 | 实验八】HBase实验:新建HBase表
一脸懵逼学习HBase---基于HDFS实现的。(Hadoop的数据库,分布式的,大数据量的,随机的,实时的,非关系型数据库)
1:HBase官网网址:http://hbase.apache.org/ 2:HBase表结构:建表时,不需要指定表中的字段,只需要指定若干个列族,插入数据时,列族中可以存储任意多个列(即KEY-VA
别先生
2018/01/02
1.5K0
一脸懵逼学习HBase---基于HDFS实现的。(Hadoop的数据库,分布式的,大数据量的,随机的,实时的,非关系型数据库)
实时即未来,车联网项目之将数据落地到文件系统和数据库【三】
​ azkaban airflow dolphinscheduler oozie 自研
Maynor
2022/09/27
5030
实时即未来,车联网项目之将数据落地到文件系统和数据库【三】
Hbase API 详解
standalone模式下hbase的主目录配置为本地的目录‘file://' 使用./start-hbase.sh启动hbase可以在jps看到一个HMaster,一个HReginServer,以及Zookeeper的线程。
Tim在路上
2020/08/04
1K0
HBase基本数据操作详解 转
http://blog.csdn.net/u010967382/article/details/37878701
stys35
2019/03/05
9970
HBase快速入门系列(6) | Hbase简单的API操作
1. 添加依赖 <dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId>
不温卜火
2020/10/28
6100
HBase快速入门系列(6) | Hbase简单的API操作
HBase入门
HBase在大数据生态中的地位举足轻重,它是谷歌bigtable的开源实现,是一种分布式存储的NoSQL数据库,能自动分片和故障转移,与HDFS高度集成,适合海量数据的高效查询。我目前用过的业务场景包括:
soundhearer
2020/10/15
4250
HBase入门
HBase的安装和使用
原文链接:https://foochane.cn/article/2019062801.html
foochane
2019/07/01
1.5K0
Hbase 源码分析之 Get 流程及rpc原理
分析版本为hbase 0.94 附上趋势团队画的图: rpc角色表: HBase通信信道 HBase的通信接口 客户端 服务端 HBase Client Master Server HMasterInterface HBase Client Region Server HRegionInterface Region Server Master Server HMasterRegionInterface 客户端发起请求: htable.get(Get) public Resul
架构师刀哥
2018/03/20
2.4K0
Hbase学习笔记
一、Hbase简介 1.什么是Hbase     HBASE是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群。     HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。     HBASE是Google Bigtable的开源实现,但是也有很多不同之处。比如:Google Bigtable利用GFS作为其文件存储系统,HBASE利用Hadoop HDFS作为其文件存储系统;Google运行MAPREDUCE来处理Bigtable中的海量数据,HBASE同样利用Hadoop MapReduce来处理HBASE中的海量数据;Google Bigtable利用Chubby作为协同服务,HBASE利用Zookeeper作为对应。 2.与传统数据库的对比     传统数据库遇到的问题:         1)数据量很大的时候无法存储         2)没有很好的备份机制         3)数据达到一定数量开始缓慢,很大的话基本无法支撑     HBASE优势:         1)线性扩展,随着数据量增多可以通过节点扩展进行支撑         2)数据存储在hdfs上,备份机制健全         3)通过zookeeper协调查找数据,访问速度块。 3.hbase集群中的角色     1、一个或者多个主节点,Hmaster     2、多个从节点,HregionServer
曼路
2018/10/18
7980
HBase Java编程示例
HelloWorld.zip 点击(此处)折叠或打开 package elementary; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.atomic.Ato
一见
2018/08/06
6990
史上最全 | HBase 知识体系吐血总结
HBase 是 BigTable 的开源 Java 版本。是建立在 HDFS 之上,提供高可靠性、高性能、列存储、可伸缩、实时读写 NoSql 的数据库系统。
五分钟学大数据
2021/11/23
5.2K0
史上最全 | HBase 知识体系吐血总结
HBase篇--HBase操作Api和Java操作Hbase相关Api
Hbase shell启动命令窗口,然后再Hbase shell中对应的api命令如下。
LhWorld哥陪你聊算法
2018/09/13
1.7K0
HBase篇--HBase操作Api和Java操作Hbase相关Api
HBase的Java API操作
Java API操作 1、导jar包     导入开发包。     将hbase安装包中lib下所有jar包导入java项目。 2、API java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) HTableDescriptor 列族(Column Family) Put 列修饰符(Column Qualifier) Get Scanner 1.HBaseAdmin 提供了一个接口来管理HBase数据库的表信息
云飞扬
2018/05/11
4.2K0
HBase行锁探索
https://github.com/sgp2004/JavaTools 代码地址 HBase客户端的行锁会对相同rowkey的读写造成很大影响,同一个进程并发更新rowkey的计数有可能造成阻塞(场景 热门短链点击增加 热门微博评论数). 例如一个线上问题: 转发微博 抱歉,此微博已被作者删除。查看帮助:http://t.cn/zWSudZc | 转发| 收藏| 评论 所有被删除的微博里短链被引用的计数要减一,结果因为微博内容删除,只剩一个帮助短链,计数都减到帮助短链里,导致服务器响应缓慢 分析行锁关
架构师刀哥
2018/03/20
1.4K0
相关推荐
Hbase源码系列之BufferedMutator的Demo和源码解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验