当前位置: 首页 > article >正文

Spring Boot如何解决跨域问题?

1.什么是跨域?

跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样。说白了就是ip、网络协议、端口都一样的时候,就是同一个域,否则就是跨域。这是由于Netscape提出一个著名的安全策略——同源策略造成的,这是浏览器对JavaScript施加的安全限制。是防止外网的脚本恶意攻击服务器的一种措施。

2.代码工程

实验目标

让Spring Boot应用支持跨域

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cors</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

第一种跨域解决方法

使用 @CrossOrigin 注解可以轻松的实现跨域,此注解既可以修饰类,也可以修饰方法。当修饰类时,表示此类中的所有接口都可以跨域;当修饰方法时,表示此方法可以跨域,它的实现如下

package com.et.cors.controller;

import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorldController {
    //@CrossOrigin
    @GetMapping("/hello")
    public String hello() {
        System.out.println("get hello");
        return "get hello";
    }

    @CrossOrigin
    @PostMapping("/hello")
    public String hello2() {
        System.out.println("post hello");
        return "post hello";

    }
}

第二种跨域解决方法

通过 CorsFilter 跨域,“*”代表全部。”**”代表适配所有接口。  其中addAllowedOrigin(String origin)方法是追加访问源地址。如果不使用”*”(即允许全部访问源),则可以配置多条访问源来做控制。 例如:

config.addAllowedOrigin("http://www.liuhaihua.cn/"); 
config.addAllowedOrigin("http://test.liuhaihua.cn/");
package com.et.cors.filter;

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 MyCorsFilter {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.setAllowCredentials(true);
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(corsConfigurationSource);
    }
}

第三种跨域解决方法

重写 WebMvcConfigurer

package com.et.cors.config;

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 WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") 
                .allowCredentials(true) 
                .allowedOrigins("*") 
                .allowedMethods("GET", "POST", "PUT", "DELETE") 
                .allowedHeaders("*");
    }
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script>
    function btnClick() {
        $.get('http://localhost:8088/hello', function (msg) {
            $("#app").html(msg);
        });
    }

    function btnClick2() {
        $.post('http://localhost:8088/hello', function (msg) {
            $("#app").html(msg);
        });
    }
</script>

<body>

<div id="app"></div>
<input type="button" onclick="btnClick()" value="get_button">
<input type="button" onclick="btnClick2()" value="post_button">

</body>
</html>

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • GitHub - Harries/springboot-demo: a simple springboot demo with some components for example: redis,solr,rockmq and so on.(cors)

3.测试

请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
  • 启动Spring Boot应用
  • 访问http://127.0.0.1:8088/index.html
  • 点击第一个按钮,出现跨域问题
Access to XMLHttpRequest at 'http://localhost:8088/hello' from origin 'http://127.0.0.1:8088' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  • 点击第二个按钮,添加注解@CrossOrigin,未出现跨域

4.引用

  • CorsConfiguration (Spring Framework 4.2.9.RELEASE API)
  • Spring Boot如何解决跨域问题? | Harries Blog™

http://www.kler.cn/a/291455.html

相关文章:

  • IDEA 开发工具常用快捷键有哪些?
  • 代码随想录算法训练营第五十一天|Day51 图论
  • 基于Java Springboot外卖平台系统
  • 独立开发:一人公司模式下副业产品的全流程
  • chatgpt训练需要什么样的gpu硬件
  • 系统掌握大语言模型提示词 - 从理论到实践
  • 区块链开发解决方案有哪些
  • 高防IP的作用有哪些?
  • 羲和能源大数据平台——Python数据绘图方法
  • 前端XSS 攻击与SQL注入 处理
  • 本地电脑交叉编译ffmpeg 到 windows on arm64
  • 机器学习课程学习周报十
  • Qlik数据集成 | Qlik 连续 14 年稳居 2024 Gartner® ABI Magic Quadrant™ 领导者
  • --- 数据结构 链表 --- java
  • pytorch pyro更高阶的优化器会使用更高阶的导数,比如二阶导数(Hessian矩阵)
  • Verilog基础,原码,反码与补码的概念
  • 【面试八股总结】MySQL 锁:全局锁、表级锁、行级锁
  • 国产游戏行业的崛起:技术挑战与未来机遇
  • Java | Leetcode Java题解之第393题UTF-8编码验证
  • 传递给 LEFT 或 SUBSTRING 函数的长度参数无效
  • 输送线相机拍照信号触发(博途PLC高速计数器中断立即输出应用)
  • k8s - Volume 简介和HostPath的使用
  • 光电红外传感器详解(STM32)
  • web群集--nginx常见的几种负载均衡调度算法的配置过程和效果展示
  • ~/.bashrc、 ~/.bash_profile、~/.profile、 /etc/profile几个配置文件的区别
  • 亚马逊卖家测评为什么要自己养账号呢?不懂快进来看看