springboot跨域问题解决方案

下面是关于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日

相关文章

  • 解决Springboot 2 的@RequestParam接收数组异常问题

    下面就是解决Springboot 2中的@RequestParam接收数组异常问题的完整攻略: 问题描述 在使用Springboot 2的@Controller或@RestController接口接收请求参数时,如果使用@RequestParam注解接收数组参数时,有时候会出现异常,例如: Failed to convert value of type ja…

    Vue 2023年5月29日
    00
  • Vue 用Vant实现时间选择器的示例代码

    请看以下详细讲解: Vue 用Vant实现时间选择器的示例代码 1. 安装 Vant 在项目中引入 Vant UI 库,可以通过npm进行安装: npm install vant -S 也可以从CDN方式引入,在HTML文件中添加以下代码: <!– 引入 Vant 样式文件 –> <link rel="stylesheet&q…

    Vue 2023年5月29日
    00
  • vue简单实现转盘抽奖

    题目描述:请详细讲解“Vue 简单实现转盘抽奖”的完整攻略,过程中至少包含两条示例说明。 背景 本文将介绍通过 Vue 来实现一个简单的转盘抽奖的过程,在该过程中,我们将了解到如何使用 Vue 完成上下文管理、响应式处理和事件监听等功能。 准备工作 在开始前,我们需要保证以下工具已经安装: Vue.js (例如可以使用 Vue CLI 创建项目后,使用 np…

    Vue 2023年5月27日
    00
  • vue 界面刷新数据被清除 localStorage的使用详解

    下面是“vue 界面刷新数据被清除 localStorage的使用详解”的完整攻略。 一、问题背景 在使用 Vue 开发一些大型的单页应用时,经常碰到当页面进行刷新操作时,由于 Vue 界面是动态更新的,所以页面的数据也会被清空,这时候在部分场景下,我们需要一种机制缓存数据,以便在刷新后可以正常使用。其中,使用 localstorage 是最简单易行的一种方…

    Vue 2023年5月27日
    00
  • 简易Vue评论框架的实现(父组件的实现)

    下面我来详细讲解一下“简易Vue评论框架的实现(父组件的实现)”: 简述 本文主要介绍如何使用Vue.js实现一个简单的评论框架,涉及组件通信、事件触发等相关知识点。本文将从父组件的实现开始,带你逐步实现一个完整的评论框架。 父组件的实现 创建父组件 首先,我们需要创建一个父组件,用于渲染整个评论区。可以先创建一个Comment.vue文件,并定义一个简单的…

    Vue 2023年5月27日
    00
  • vue 实现购物车总价计算

    下面我会详细讲解Vue实现购物车总价计算的完整攻略。 确定购物车数据格式 首先需要明确购物车数据的格式,常见的数据结构是一个数组,每个元素表示一件商品,包含以下字段: { id: String, // 商品id name: String, // 商品名称 price: Number, // 单价 count: Number // 数量 } 创建一个购物车组件…

    Vue 2023年5月29日
    00
  • vue跳转页面打开新窗口,并携带与接收参数方式

    在Vue中,我们可以通过router实例和router-link标签来实现页面跳转。当需要在新窗口中打开一个页面并携带参数时,可以使用window.open方法和URLSearchParams对象来实现。 以下是其中一种实现方式的代码: <template> <!–使用router-link标签指定跳转到新页面的路径–> <…

    Vue 2023年5月27日
    00
  • 详解React中的不可变值

    详解React中的不可变值 在使用React进行开发时,不可变值是一个非常重要的概念。在不可变值的约束下,我们可以在React组件的生命周期中避免出现直接修改state的情况。这不仅可以减少错误,而且还可以实现更好的性能。 不可变值的定义 所谓不可变值,指的是一旦被创建,就不能再被修改的值。在JavaScript中,可以通过以下几种方式创建不可变值: 字符串…

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