Springboot跨域处理的几种方式

news2024/11/17 16:48:35

作者简介

作者名:编程界小明哥
简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!明哥QQ:283582761

测试工具 IDEA

什么是跨域

当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求。

浏览器出于安全考虑,会限制跨域访问,就是不允许跨域请求资源,要求协议,IP和端口必须都相同,其中有一个不同就会产生跨域问题,这就是同源策略。

跨域举例

请求方响应方是否跨域原因
http://www.ming.comhttp://www.ming.com/test.html协议、域名、端口相同
http://www.ming.comhttps://www.ming.com/test.html协议不同
http://www.ming.comhttp://www.minggod.com/test.html主域名不同
http://www.ming.comhttp://haha.ming.com/test.html主域名相同、子域名不同
http://www.ming.com:8080http://www.ming.com:8090/test.html端口不同

跨域访问实例

后端测试代码

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CorsController {
    @GetMapping("/cors")
    public  String hello(){
        return "hello cors";
    }
}

用浏览器打开,我这里配置的端口是8090
在这里插入图片描述
在前端项目中用axios访问时

<template>
    <span>跨域请求:{{result}}</span>
</template>

<script>
    import axios from 'axios';
    export default {
        name: "Cors",
        data(){
          return {
              result:""
          }
        },
        methods:{
            getTest(){
                axios.get("http://localhost:8090/cors").then(res=>{
                    console.log(res.data)
                    this.result=res.data
                })
            }
        },
        created() {
            this.getTest();
        }
    }
</script>

<style scoped>

</style>

在这里插入图片描述

报错中的关键词
Access-Control-Allow-Origin

跨域处理(后端)

说明:
这里是针对Springboot 2.4.0以后的写法,之前的版本写法是.allowedOrigins(*)
2.4.0之后会报错替换成.allowedOriginPatterns即可
代码中会有注释说明

  1. 添加跨域配置类
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();
        //放行哪些原始域
        config.addAllowedOriginPattern("*");//2.4.0后的写法
       // config.addAllowedOrigin("*");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}

重启后端服务后,刷新前端页面正常访问,效果如下
在这里插入图片描述
2. 重写WebMvcConfigurer

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)
                //放行哪些原始域
                //.allowedOrigins("*")
                .allowedOriginPatterns("*")//2.4.0后的写法
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

在这里插入图片描述
3. 注解 @CrossOrigin

类上注解

@RestController
@CrossOrigin("*")
public class CorsController {
    @GetMapping("/cors")
    public  String hello(){
        return "hello cors";
    }
}

方法上注解
方法可以单独跨域,没有 @CrossOrigin(“*”) 注解的方法则不行

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CorsController {
    @GetMapping("/cors")
    @CrossOrigin("*")
    public  String hello(){
        return "hello cors";
    }
    @GetMapping("/cors1")
    public  String hello1(){
        return "hello cors1";
    }
}

  1. 自定义过滤器

可以正常跨域

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
 
@Component
public class MyCorsFilter implements Filter {
 
    public void doFilter(ServletRequest req, ServletResponse res,
                         FilterChain chain) throws IOException, ServletException {
 
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest httpServletRequest = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("origin"));
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(req, res);
 
    }
 
    public void init(FilterConfig filterConfig) {}
    public void destroy() {}
}
  1. 手动设置响应头(局部跨域)

此方案听说可以用,但明哥自己测试了,不能用,依然有问题,不建议!

@GetMapping("/cors1")
public  String hello1(HttpServletResponse response){
    response.addHeader("Access-Allow-Control-Origin","*");
    return "hello cors1";
}

小结

这节总结了“ Springboot跨域处理 ”,希望能对大家有所帮助,请各位小伙伴帮忙 【点赞】+【收藏】, 如果有兴趣跟小明哥一起学习Java和前端的,【关注一波】不迷路哦。
请到文章下方帮忙【一键三连】谢谢哈!

在这里插入图片描述

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

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

相关文章

基于springboot+mybatis的制造行业供应链管理系统

一、项目简介 基于springbootmybatis的制造行业供应链管理系统 二、实现功能 支持基础数据、用户管理、职务管理、修改密码、客户账号管理、组织管理 物料管理、物料短码、物料短码查询、物料分类维护 项目类别维护、分配采购员、设置最大最小库存、物料检验项管理 部门管…

Elasticsearch入门、API操作

文章目录概念倒排索引es的一些概念安装ES、Kibana总结索引库操作mapping映射属性创建索引库和映射查询索引库修改索引库删除索引库总结文档操作新增文档查询文档删除文档修改文档全量修改增量修改RestAPI引入依赖、初始化RestClient索引库 操作创建索引库删除索引库判断索引库是…

[附源码]Python计算机毕业设计黑河学院校友交流网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

ABBYY2023PDF及OCR文字识别软件

ABBYY FineReader PDF2023最新版使专业人士在数字化工作场所能够更大限度地提高效率。 FineReader PDF 的特色是采用了 ABBYY 新推出的基于 AI的OCR 技术&#xff0c;可以更轻松地在同一工作流程中对各种文档进行数字化、检索、编辑、加密、共享和协作。 现在&#xff0c;信息工…

U盘安装CentOS7

官网找到CentOS7的ISO镜像&#xff1a;CentOS-7-x86_64-DVD-2207-02.iso&#xff08;大小4.42G&#xff09; 准备一个8G的U盘&#xff0c;格式化&#xff0c;然后通过UltraISO工具将ISO镜像写入到U盘。 接着开机启动U盘&#xff0c;华硕是按esc键。 选择install cenetos7 li…

【图像处理】打靶仿真系统【含GUI Matlab源码 1043期】

⛄一、打靶仿真系统简介 1 课题描述 2 课题建模过程 a)第一&#xff0c;获取武器的各个参数&#xff0c;并且由这些参数计算武器在方向和高低上的响应公算偏差&#xff1b; b)第二&#xff0c;射击过程中方向和高低上的偏差呈正态分布。在matlab中取normrnd函数实现改功能&am…

《C语言深度解剖》二 static

最名不副实的关键字 static 认识多文件如下 extern 需要extern先声明在使用 生命没有开辟空间&#xff01;100 在main.c里 所有的变量声明的时候&#xff0c;不能设置初始值 为什么要有头文件 头文件要包含 变量的声明int g_val 函数的声明void show(),没有函数的声明虽然可…

CentOS7配置VNC远程桌面

桌面还是有很多方便的地方&#xff0c;在用U盘给电脑安装了centos7&#xff08;带gnome&#xff09;后&#xff0c;接着就需要弄远程桌面。 &#xff08;1&#xff09;安装vncserver yum -y install tigervnc* &#xff08;2&#xff09;启动vnc服务 vncserver &#xff0…

[paddledet][深度学习][原创]paddledet打印出FLops正确方法

第一步&#xff1a;去PaddleDetection\configs\runtime.yaml将print_flops设置true 在paddle环境安装paddleslim&#xff0c;我是paddlepaddle-gpu2.3.2但是我安装paddleslim2.4.0会报错 ImportError: cannot import name _legacy_C_ops from paddle 然后我换成2.3.4版本就好了…

第二十六天:Denoising Diffusion Probabilistic Models(DDPM)

摘要 我们使用扩散概率模型提出了高质量的图像合成结果&#xff0c;这是一类latent variable模型&#xff0c;灵感来自非平衡热力学。我们最好的结果是通过训练weighted variational bound &#xff0c;根据新颖的连接扩散概率模型和去噪分数匹配朗之万动力学进行设计&#xf…

【记录】props和data响应式、watch初始化..谁先执行【Vue父子组件生命执行周期】

文章目录一 、 总结1-1 源码中清楚写明&#xff1a;1-2二、 本次遇到的问题&#xff1a; 父传子props&#xff0c;子组件无法在mounted处理2-1 代码如下2-2一 、 总结 1-1 源码中清楚写明&#xff1a; 1、 组件初始化的时候,created&#xff0c;props&#xff0c;data…执行先…

生物素-二硫键-琥珀酰亚胺酯 Biotin-SS-NHS CAS:142439-92-7 具有良好的水溶性

名称&#xff1a;生物素-二硫键-琥珀酰亚胺酯 英文简称&#xff1a;BIOTIN-SS-NHS&#xff1b;NHS-SS-Biotin CAS&#xff1a;122266-55-1 结构式&#xff1a; Biotin-SS-NHS ester结构式 分子式&#xff1a;C19H28N4O6S3 分子量&#xff1a;504.64 纯度&#xff1a;95% …

Python之threading: 带你了解多线程的强大威力!

前言 什么是多线程 多线程是指在一个程序中同时创建和使用多个执行流(thread)来执行不同的任务。这样多个任务就可以同时进行&#xff0c;从而提高程序的执行效率。 在python使用多线程的方法 在 Python 中有两种方法可以使用多线程&#xff1a;使用 Python 自带的 threadin…

Redis Java 客户端工具 - Lettuce框架介绍

Redis Java 客户端 - Lettuce 今天学习下Redis Java客户端开源项目 - Lettuce&#xff0c;Lettuce支持同步、异步通信的方式 API调用&#xff0c;也支持响应式编程API&#xff0c;包括发布/订阅消息、高可用性服务部署架构。 开始之旅 Maven依赖 <dependency><gro…

Python实现SSH远程操作Linux(paramiko库)

参考&#xff1a;https://blog.csdn.net/qq_40558166/article/details/100172501 一、官网 https://www.paramiko.org/ 二、安装库 1.命令 pip install paramiko 或 pip install paramiko –i https://pypi.douban.com/simple/ 三、辅助软件(可忽略) 1.Xshell(执行命令) …

[附源码]Node.js计算机毕业设计黑格伯爵国际英语贵族学校官网Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Ubuntu 配置本地root登录

Ubuntu 配置本地root登录–18.04 给root用户设置密码 按照下图方式 命令&#xff1a;sudo passwd root 切换到root用户 使用 su 或者是 su root 切换到 root 修改配置文件 进入该目录&#xff1a; cd /usr/share/lightdm/lightdm.conf.d/ 查看文件 ls 使用gedit 编辑文…

Arduino UNO新手零基础入门学习博客汇总

写在开头 最近在上Arduino的课&#xff0c;可以说Arduino对新手来说非常友好了&#xff0c;因为相比于51和32&#xff0c;Arduino的库函数下载就好&#xff0c;不需要自己去写&#xff0c;就很方便 我的硬件设备 博客汇总 博客内容大多数以实际案例为主&#xff0c;基本都是…

机器学习100天(七):007 简单线性回归理论

机器学习100天,今天讲的是简单线性回归理论。 首先来看第一个问题:什么是线性回归?我们先引入一个例子。 假如我现在有一份数据,这份数据是一些地区人口和对应房价的信息。我们把这份数据展示在二维平面上。横坐标是人口,纵坐标是房价,红色的点就表示每个地区的实际人口…

论文精读:EfficientDet: Scalable and Efficient Object Detection

Abstract 首先&#xff0c;本篇论文提出了一种加权双向特征金字塔网络&#xff08;BiFPN&#xff09;&#xff0c;进行简单、快速的多尺度特征融合&#xff1b;其次&#xff0c;作者提出了一种复合尺度方法&#xff0c;同时统一调整所有主干、特征网络和box/类别预测网络的分辨…