跨域问题?别担心!Spring Boot的5种奇巧淫技解救你

news2025/8/4 19:34:06

来源:https://blog.csdn.net/weter_drop/article/details/112135940

一、为什么会出现跨域问题

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

二、什么是跨域

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

三、非同源限制

  1. 无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB

  2. 无法接触非同源网页的 DOM

  3. 无法向非同源地址发送 AJAX 请求

四、java 后端 实现 CORS 跨域请求的方式

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

  1. 返回新的CorsFilter

  2. 重写 WebMvcConfigurer

  3. 使用注解 @CrossOrigin

  4. 手动设置响应头 (HttpServletResponse)

  5. 自定web filter 实现跨域

注意:

  • CorFilter / WebMvConfigurer / @CrossOrigin 需要 SpringMVC 4.2以上版本才支持,对应springBoot 1.3版本以上

  • 上面前两种方式属于全局 CORS 配置,后两种属于局部 CORS配置。如果使用了局部跨域是会覆盖全局跨域的规则,所以可以通过 @CrossOrigin 注解来进行细粒度更高的跨域资源控制

  • 其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域

1.返回新的 CorsFilter(全局跨域)

在任意配置类,返回一个 新的 CorsFIlter Bean ,并添加映射路径和具体的CORS配置路径。

@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        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(全局跨域)

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

3. 使用注解 (局部跨域)

在控制器(类上)上使用注解 @CrossOrigin:,表示该类的所有方法允许跨域。Spring Boot 系列最全教程看这里:https://blog.didispace.com/spring-boot-learning-2x/

@RestController
@CrossOrigin(origins = "*")
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

在方法上使用注解 @CrossOrigin

@RequestMapping("/hello")
@CrossOrigin(origins = "*")
 //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域
public String hello() {
    return "hello world";
}

4. 手动设置响应头(局部跨域)

使用 HttpServletResponse 对象添加响应头(Access-Control-Allow-Origin)来授权原始域,这里 Origin的值也可以设置为 “*”,表示全部放行。

@RequestMapping("/index")
public String index(HttpServletResponse response) {
    response.addHeader("Access-Allow-Control-Origin","*");
    return "index";
}

5. 使用自定义filter实现跨域

首先编写一个过滤器,可以起名字为:MyCorsFilter.java

package com.mesnac.aop;

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.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;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    chain.doFilter(req, res);
  }
  public void init(FilterConfig filterConfig) {}
  public void destroy() {}
}

在web.xml中配置这个过滤器,使其生效

<!-- 跨域访问 START-->
<filter>
 <filter-name>CorsFilter</filter-name>
 <filter-class>com.mesnac.aop.MyCorsFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>CorsFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 跨域访问 END  -->

都学会了吧?建议收藏备用!

关注公从号:臻大虾,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

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

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

相关文章

SpringBoot自定义注解+异步+观察者模式实现业务日志异步入库

SpringBoot自定义注解异步观察者模式实现业务日志异步入库前言基础环境导入依赖编写yml配置数据库设计代码实现实体类编写注解业务类型枚举编写切片ip工具类事件发布监听者Controller控制层servicemapper验证前言 我们在企业级的开发中&#xff0c;必不可少的是对日志的记录&a…

VSCode将markdown文件导出为带书签的PDF文件

背景 之前找工作的总结性文章&#xff0c;全是markdown形式的想直接变成PDF好携带。方便查找 初步探索遇到的问题 markdown直接在chrome钟打开&#xff0c;右键有打印选项&#xff0c;有一说一&#xff0c;效果不错&#xff0c;唯一缺点&#xff0c;没书签。 怎么办 查资料…

收音机知识,调谐(选频/滤波),调制(升频)

参考&#xff1a;https://www.bilibili.com/video/BV1d14y1N7nm/?spm_id_from333.999.0.0&vd_source00bd76f9d6dc090461cddd9f0deb2d51 有关知识提纲整个信号的传输变化调谐人耳听到声音的频率范围&#xff08;20~20000Hz&#xff09;天线和传送信号的波长关系波长和天线长…

LeetCode 剑指 Offer II 106. 二分图【二分图匹配】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

京东pop店铺订单导出

下载安装与运行 下载、安装与运行 语雀 特别提醒 只能导出已登录店铺的订单导出的收件人手机号是虚拟号 功能 主要是方便线下工厂发货的店主 所见即所得的导出自由选择导出项自由排序Excel导出列顺序导出过程中有进度提示&#xff0c;用户可以随时提前中止 什么是所见即所…

Linux网络编程概述

文章目录 前言一、客户端与服务端二、客户端程序编写三、程序的编译和运行总结前言 本篇文章将带大家来正式学习Linux网络编程。 一、客户端与服务端 一般认为服务器是一个长时间运行的程序(既守护程序)他只在相应来自网络请求时才发送网络消息 协议的另一端是客户端程序,…

Swagger文档注释

本文以DRF框架为例使用 为什么要接口文档注释 一. 方便后端调试与后续接口更新&#xff1b; 二. 对于大型前后端分离项目&#xff0c;前后端人员是分开开发的&#xff0c;甚至前端的人你都不知道远在何处&#xff0c;这时候接口文档的重要性就太重要了。 三. 接口注释文档常用…

巧用千寻位置GNSS软件| 点放样操作指南

在工程测量中&#xff0c;点放样就是将设计或图纸上的点位在实地上测量出来&#xff0c;将目标坐标输入软件在实地放样出来的过程。本文将围绕“如何在千寻位置GNSS软件上完成点放样操作”进行分步骤讲解。点击【测量】->【点放样】->【坐标点库】&#xff0c;选择一个点…

气传导和骨传导耳机的区别?这两种耳机哪个更好更实用?

气传导和骨传导耳机的最大区别&#xff1a;就在于发声原理的不同。 这两种耳机&#xff0c;一种是空气传播声音&#xff0c;一种是骨骼固体传声。 气传导耳机&#xff0c;就是声音从外部传过来&#xff0c;并由外耳、中耳传导到内耳&#xff0c;这是我们日常中接触最多的传导…

第三方支付接口测试面试要点

第三方支付接口测试面试要点 第三方支付接口测试&#xff0c;主要是看你的接口功能实现的是否满足需求&#xff0c;以及你的测试思路是否正确。因此&#xff0c;接口测试工程师要从以下几个方面来准备。 首先&#xff0c;我们需要了解第三方支付的流程; 最后&#xff0c;我们需…

Spring 之 AOP 原理详解

Spring 是一个流行的 Java 企业应用程序开发框架。其中的 AOP&#xff08;面向切面编程&#xff09;是 Spring 框架中的一个核心概念。本文将介绍 Spring AOP 的底层实现原理&#xff0c;并通过源代码解析来详细阐述其实现过程。 什么是AOP&#xff1f; AOP是一种编程范式&…

three.js之自定义一个正方体(网格)

本节主要通过自定义顶点和平面的方式&#xff0c;创造一个立方体。真正的开始走近three.js。 效果图 坐标系 坐标系支持右手定则。图中红色是x轴&#xff0c;绿色是y轴&#xff0c;蓝色是z轴 源码 引入的插件js【本人的csdn也有下载资源&#xff0c;如果打不开git可以在csd…

AI网站汇总(免费chatgpt)(60个持续增加中)

本文总结了6大类AI工具,包括:聊天AI、绘画AI、AI提示词、图像处理、UI设计和3D设计,汇总60个AI网站,一键收藏。 目录 一、聊天AI 二、绘画AI 三、AI提示词 四、图像处理

SQL笔记(2)——MySQL的表操作与索引(收藏吃灰版)

本文详细记录如何通过命令的方式修改MySQL的表结构&#xff0c;例如新增列、删除列等&#xff1b;不止学会了&#xff0c;你还学懂了&#xff0c;收藏吃灰~ 开始之前 上一篇文章创建了一些表&#xff0c;ER图如下。本文针对score表进行操作&#xff0c;场景就是新增一个备注rem…

自动化测试面试一周拿到3个offer,只因为我记下了这个文档

目录 一、接口测试基础 二、 接口测试工具 三、自动化测试 四、自动化测试工具 五、总结 一、接口测试基础 1、公司接口测试流程是什么&#xff1f; 从开发那边获取接口设计文档、分析接口并进行用例设计、并提前录入到接口测试工具 jmeter&#xff0c;等开发那边进行…

客户关系管理小程序实战教程01-需求分析

日常企业经常需要在网上拓展业务&#xff0c;通过互联网工具来宣传自己的产品。用户在看到企业宣传的内容后&#xff0c;如果有需要就会通过各种方式联系到企业。 为了方便的跟踪这些销售的机会&#xff0c;我们开发一款企业内部销售团队使用的小程序&#xff0c;便于管理潜在…

Win11的两个实用技巧系列之磁盘分区后再恢复的方法、调高进程的优先级方法

Win11磁盘分区后怎么恢复到分区前?Win11磁盘分区后在恢复的方法 很多人不知道win11磁盘分区怎么恢复回去?今日为你们带来的文章是win11磁盘分区的恢复方法&#xff0c;还有不清楚小伙伴和小编一起去学习一下吧 有不少小伙伴在使用电脑的时候经常会根据自身需求对其进行磁盘的…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

文章目录一、开发要点1、基本设置 - 取消默认内外边距 / 取消基本样式 / 图片自适应2、外层父容器设置 - 子绝父相 / 盒子浏览器水平居中 / 设置圆角 / 设置溢出隐藏3、左右按钮设置 - 绝对定位垂直居中设置 / 使用圆角矩形设置半圆 / 文字垂直居中4、底部小圆点设置 - 绝对定位…

Web_python_template_injection(Python模块注入)

打开链接&#xff0c;提示是Python的模块注入 我们先了解一些基本概念&#xff1a; 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码的分离&#xff0c;这大大提升了开发效率&#xff0c;良好的设计也使得代码重用变得更加容…

智慧停车场解决方案,停车场导航技术怎么实现

停车场导航技术怎么实现&#xff1f;随着城市化的不断发展&#xff0c;停车场建的越来越大&#xff0c;同时也越来越复杂&#xff0c;停车、找车成为很多人感到十分头疼的问题。在这种情况下&#xff0c;一个高效的停车场电子地图应用已经成为城市交通管理中不可缺少的组成部分…