springboot跨域问题解决方案

yizhihongxing

下面是关于springboot跨域问题的解决方案完整攻略。

背景

在前后端分离的开发模式中,前端项目和后端项目通常会分别部署到不同的域名下,因此会出现跨域请求的问题。这时候就需要解决跨域问题。

解决方案

1. 添加跨域支持的Filter

Spring Boot提供了一种通过Filter来实现跨域请求的解决方案,步骤如下:

  1. 创建一个继承自OncePerRequestFilter的类,并重写其doFilterInternal方法。

```java
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter extends OncePerRequestFilter {

   @Override
   protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
       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"); // request headers信息
       filterChain.doFilter(request, response);
   }

}
```

  1. src/main/resources/application.properties中添加如下配置:

properties
# CORS
cors.allowed-origins=*
cors.allowed-methods=POST, GET, OPTIONS, DELETE
cors.max-age=3600
cors.allowed-headers=x-requested-with, Content-Type

如果你使用的是yaml格式的配置文件,则配置如下:

yaml
# CORS
cors:
allowed-origins: "*"
allowed-methods: "POST, GET, OPTIONS, DELETE"
max-age: 3600
allowed-headers: "x-requested-with, Content-Type"

  1. 重启Spring Boot应用程序。

2. 使用Spring Boot自带的CORS支持

Spring Boot还支持使用注解的方式来实现跨域请求,步骤如下:

  1. 在Controller类或者方法上添加@CrossOrigin注解。

```java
@RestController
@RequestMapping("/user")
public class UserController {

   @CrossOrigin(origins = {"http://localhost:8080", "*"})
   @GetMapping("/list")
   public List<User> getUserList() {
       // ...
   }

}
```

@CrossOrigin注解有控制跨域请求的源origin,方法和请求头等参数的功能。

origins参数为必须参数,用于限制跨域请求的源,可以是字符串数组或者“*”,表示接受任何源。

  1. 重启Spring Boot应用程序。

示例

示例1:基于Filter的跨域请求解决方案

假设前端项目在http://localhost:8080,后端项目在http://localhost:8888,要使用JS的ajax方式请求后端数据,代码如下:

$.ajax({
    url: 'http://localhost:8888/api/user/list',
    method: 'GET',
    dataType: 'json',
    success: function(data) {
        // ...
    }
});

这时候就会出现跨域请求的问题。使用基于Filter的跨域请求解决方案,只需要按照上述步骤添加CorsFilter类和配置文件即可解决问题。

示例2:基于注解的跨域请求解决方案

在示例1的基础上,我们可以使用@CrossOrigin注解来解决跨域请求问题。代码如下:

@RestController
@RequestMapping("/api/user")
public class UserController {

    @CrossOrigin(origins = {"http://localhost:8080", "*"})
    @GetMapping("/list")
    public List<User> getUserList() {
        // ...
    }

}

这样就可以处理来自http://localhost:8080和任何其他源的跨域请求了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot跨域问题解决方案 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 在vue项目中,将juery设置为全局变量的方法

    在Vue项目中,使用jQuery需要将其设置为全局变量,下面是完整的攻略: 安装jQuery 首先,需要在项目中安装jQuery,可以使用npm或yarn进行安装。这里以npm为例: npm install jquery –save-dev 引入jQuery并设置为全局变量 在Vue项目的入口文件中(一般是main.js),需要引入jQuery并将其设置为…

    Vue 2023年5月28日
    00
  • Vue+webpack项目基础配置教程

    下面是针对“Vue+webpack项目基础配置教程”的完整攻略,包括以下几个部分的内容: 前置条件 安装Vue和webpack 创建Vue项目 配置webpack 示例说明 参考资料 1. 前置条件 在学习“Vue+webpack项目基础配置教程”前,需要您已经熟悉Vue框架的基本语法和开发流程,同时了解webpack打包工具的基本概念和使用方法。 2. 安…

    Vue 2023年5月28日
    00
  • vue-i18n的9以上版本中@被用作特殊字符处理,直接用会报错问题

    在vue-i18n的9以上版本中,@符号被用作特殊字符处理。如果在国际化文件中直接使用@符号,会导致解析错误并报错。因此,需要进行转义处理,才能正常使用。 处理方法如下: 1.将@符号转义为其HTML实体编码,即”@”。 将”@”转义为”@”可以避免在vue-i18n中使用@符号时报错。例如,以下是一个包含@符号的英文字符串: { &quot…

    Vue 2023年5月27日
    00
  • 在项目中封装axios的实战过程

    在项目中封装axios能够使代码更加简洁易读,并且可以统一管理请求接口、请求头等信息,提高代码的可维护性和可拓展性。下面是封装axios的完整攻略: 步骤一:安装axios并创建实例 首先需要在项目中安装axios依赖包,通过npm仓库下载、或者使用CDN链接在html文件中引入。 安装命令:npm install axios 接着,我们需要在项目中创建一个…

    Vue 2023年5月28日
    00
  • vue粘贴复制功能的实现过程记录

    下面我将对 “Vue粘贴复制功能的实现过程记录” 进行详细的讲解和攻略: 1. 实现前的准备工作 在实现粘贴复制功能之前,我们需要做一些准备工作,比如引入clipboard.js库和vue-clipboard2插件等,以及对要进行复制的节点进行选择和绑定事件等。 1.1 引入clipboard.js库和vue-clipboard2插件 引入clipboard…

    Vue 2023年5月27日
    00
  • Vue项目中跨域问题解决方案

    Vue项目中跨域问题解决方案的完整攻略一般可以分为以下几个步骤: 第一步:了解跨域问题 跨域问题是指在同一页面中访问不同域名或端口的资源时所遇到的限制。原因在于浏览器出于安全考虑,防止恶意网站进行访问和篡改。 第二步:确定跨域请求的场景 在Vue项目中,跨域请求一般出现在以下几个场景: 前端(Vue项目)请求后端的API接口 前端发送Ajax请求 前端使用w…

    Vue 2023年5月28日
    00
  • Vue自定义Form组件实现方法介绍

    下面详细讲解“Vue自定义Form组件实现方法介绍”的完整攻略。 什么是自定义Form组件? 自定义Form组件是指,开发者可以使用Vue框架中提供的组件相关API自己封装一个表单组件,以便于实现业务需求。这种自定义Form组件可以根据不同的业务需求来进行设计,而且重用率非常高,可以减少重复的代码。 实现方法 实现Vue自定义Form组件的方法如下: 1.编…

    Vue 2023年5月27日
    00
  • 茶余饭后聊聊Vue3.0响应式数据那些事儿

    让我来详细讲解一下“茶余饭后聊聊Vue3.0响应式数据那些事儿”的完整攻略。 Vue3.0响应式数据 在Vue3.0中,提供了一个新的API——ref,来创建响应式数据。 创建响应式数据 要创建一个响应式数据,只需要使用ref函数进行创建即可,例如: import { ref } from ‘vue’ const count = ref(0) 使用响应式数据…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部