首页 > 其他分享 >SpringBoot中跨域问题的处理

SpringBoot中跨域问题的处理

时间:2023-06-17 23:32:29浏览次数:48  
标签:SpringBoot 处理 springframework annotation import org hello 跨域

跨越问题产生原因:产生跨域问题的原因是浏览器的同源策略,所谓同源是指:域名,协议,端口相同。如果不同,将会出现跨域问题。

一、创建项目

我们创建两个项目,一个命名为provider提供服务,一个命名为consumer消费服务,第一个项目端口配置为8080,第二个项目端口配置为8081,然后在provider中提供一个接口,供consumer项目里访问。

provider项目:

接口代码示例如下:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author qx
 * @date 2023/06/17
 * @desc 提供数据
 */
@RestController
public class HelloController {

    /**
     * 访问hello路径,返回hello字符串
     */
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

consumer项目:

引入thymeleaf依赖,使用页面测试跨越问题。

<!--thymeleaf-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

消费者页面示例代码如下:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author qx
 * @date 2023/06/17
 * @desc 消费者页面
 */
@Controller
public class IndexController {

    /**
     * 访问/index路径打开index.html页面
     */
    @GetMapping("/index")
    public String toIndex() {
        return "index";
    }

}

index.html页面代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" onclick="btnClick()" value="click"/>
<script src="https://lib.baomitu.com/jquery/1.12.4/jquery.min.js"></script>
<script>
    function btnClick() {
        // 请求provider中的数据接口
        $.get('http://localhost:8080/hello', function (msg) {
            console.log(msg);
        });
    }
</script>
</body>
</html>

二、跨域问题产生

分别启动两个项目,点击consumer项目中index页面中的按钮。

SpringBoot中跨域问题的处理_spring

SpringBoot中跨域问题的处理_ide_02

我们发现没有成功访问到数据,页面控制台遇到了跨域访问的异常提示。

三、解决跨域 

1.加@CrossOrigin注解

在provider项目的方法中加上@CrossOrigin注解,参数值为需要跨域访问的目标地址。

示例代码如下:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author qx
 * @date 2023/06/17
 * @desc 提供数据
 */
@RestController
public class HelloController {

    /**
     * 访问hello路径,返回hello字符串
     */
    @CrossOrigin(value = "http://localhost:8081/")
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

表示这个方法可以接受来自http://localhost:8081/的请求,配置完成后重启provider项目,我们再次在consumer中发送请求,浏览器控制台不会报错,获取到了provider项目的数据。

SpringBoot中跨域问题的处理_跨域_03

SpringBoot中跨域问题的处理_跨域_04

2.跨域全局配置

在每个方法都加上@CrossOrigin很麻烦,我们在provider项目中通过在SpringMvc配置类中重写addCorsMappings实现全局的跨域配置。

示例代码如下:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author qx
 * @date 2023/06/17
 * @desc 全局跨域配置
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8081/")
                .allowedMethods("*")
                .allowedHeaders("*");
    }
}

/**表示本应用的所有方法都会去处理跨域请求。

allowedOrigins表示可以跨域的目标访问地址。

allowedMethods表示允许通过的数。

allowedHeaders表示允许的请求头。

这样配置之后,我们就不必在每个方法上都单独的跨域配置了。

我们把provider项目中的@CrossOrigin注解去掉,重新启动provider项目。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author qx
 * @date 2023/06/17
 * @desc 提供数据
 */
@RestController
public class HelloController {

    /**
     * 访问hello路径,返回hello字符串
     */
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

我们继续点击consumer项目中index页面上的请求按钮,成功获取到了数据。

SpringBoot中跨域问题的处理_ide_05

SpringBoot中跨域问题的处理_跨域_06


标签:SpringBoot,处理,springframework,annotation,import,org,hello,跨域
From: https://blog.51cto.com/u_13312531/6506696

相关文章

  • SpringBoot整合RocketMQ
    前提是必须已经安装了RocketMQ并配置好相关的环境变量(自行百度) 第一步: 第二步: 第三步:  第四步: ......
  • 手写SpringBoot启动器主要步骤
    这里写目录标题背景过程2.1自启动实现原理2.2手动实现SpringBoot自启动2.2.1宏观2.2.1微观2.2.1.1三个服务之间调用2.2.1.2自定义注解2.2.1.1业务组装2.2.1.3启动类升华自定义注解:手动装配组件:简化启动过程:自动化注入依赖:简化启动类:背景更好的理解框架:通过手写SpringBoot启动类,......
  • springboot中自定义注解在service方法中,aop失效
    问题描述写了个自定义注解,但是该注解只会出现在serviece层中的方法中。启动发现aop未拦截到问题原因:调用service中的xx()方法时,Spring的动态代理帮我们动态生成了一个代理的对象,暂且叫他$XxxxService。所以调用xx()方法实际上是代理对象$XxxxService调用的。但是在xx()方法内调用同......
  • python--python脚本中保存处理后的音频文件到指定文件夹时报错permission denied 的问
    问题1:自己编写的python脚本中,将处理后的音频文件保存到指定的文件夹(用到了pydub库对音频文件进行处理),但保存处理后的文件到指定文件夹时,会报错permissiondenied的错误,如下截图解决思路:一开始网上查资料,基本上都是说文件夹没有读写权限,让设置文件夹权限等操作,但设置了之后还是......
  • springboot注册过滤器
    springboot注册过滤器需要使用过滤器的话,优先选择拦截器。因为拦截器符合aop思想。在springboot中使用过滤器有三种方式。分别如下方式一:传统web在传统javaweb、ssm中使用过滤器差不多类似,这里以java配置为例,实现Filter接口@WebFilter("/*")publicclassMyFilter01i......
  • python基础之字符串处理
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 哈工大体系结构lab3 —— 流水线处理器的verilog实现
    流水线处理器的verilog实现个人认为我码风还算可以,如果我的代码有写的错误/值得改进之处,欢迎指出!!base版本设计图如下,WB阶段有一个MUX没画,因为没地方了(懒了)哈哈最后版本跟我最开始写出来的框架有些许变化,如果你看到了让你不知所以然的代码,大概率是修锅的时候造的。。CPU.v`timesc......
  • SpringBoot整合ActiveMQ
    第一步: 第二步: 第三步: 下面如有需要才使用 ......
  • # yyds干货盘点 # 盘点一个Pandas日期处理的问题
    大家好,我是皮皮。一、前言前几天在Python群里【爱的力量】问了一个Python日期处理的问题,这里拿出来给大家分享下。'2022-03-2508:00:00.000000000'大佬们,这种格式的字符串有什么简单的方法可以转换为2022年3月25日8时吗?这里他自己也写了一个代码,如下所示:x='2022-03-2508:00:00......
  • Springboot整合mongodb
    入门案例创建工程,导入依赖导入依赖点击查看代码<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.3.9.RELEASE</version>......