文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot 如何解决跨域问题?

2024-11-28 15:54

关注

一、跨域问题

1.什么是跨域

跨域是指浏览器出于安全考虑,对来自不同域名、协议或端口的请求进行限制。通常,当一个网页发起的请求目标是与其来源不同的域时,就会发生跨域问题。浏览器采用同源策略(Same-Origin Policy)来阻止某些不安全的请求。

2.同源策略

同源策略是浏览器的一个安全特性,用于防止恶意网站读取另一个网站的敏感信息。只有当协议、域名和端口号都相同时,浏览器才允许请求通过。

3.CORS

CORS,全称 Cross-Origin Resource Sharing 翻译为跨域资源共享,它使用额外的 HTTP头来告诉浏览器允许 Web应用从不同的域进行请求。CORS是 W3C的一个标准,允许服务器声明哪些源站点可以访问它的资源。

二、Spring Boot如何解决跨域?

整理来说,Spring Boot解决跨域问题的方法有三种:

1.全局配置CORS

在Spring Boot中,可以通过实现WebMvcConfigurer接口来全局配置CORS。

import org.springframework.context.annotation.Bean;
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("/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

代码分析:

2.使用@CrossOrigin注解

Spring提供了@CrossOrigin注解用于简化跨域配置。可以在控制器类或方法级别使用。

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

@RestController
public class MyController {

    @CrossOrigin(origins = "http://example.com")
    @GetMapping("/greet")
    public String greet() {
        return "Hello World";
    }
}

代码分析:

3.自定义过滤器

通过自定义过滤器,可以更灵活地处理跨域请求。

如下示例代码,自定义过滤器 CorsFilter 实现 Filter,从而允许https://yuanjava.com 作为跨域的来源。

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import org.springframework.stereotype.Component;

@Component
public class CorsFilter implements CorsFilter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Access-Control-Allow-Origin", "https://yuanjava.com");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        res.setHeader("Access-Control-Allow-Headers", "Content-Type");
        res.setHeader("Access-Control-Allow-Credentials", "true");
        
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
            return;
        }

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

代码分析:

对于OPTIONS预检请求,直接返回状态码200。

三、示例展示

假设我们有一个简单的 Spring Boot应用程序,它提供一个 RESTful API。我们希望允许来自"https://yuanjava.com"的跨域请求。

1.项目结构

src
└── main
    ├── java
    │   └── com
    │       └── yuanjava
    │           ├── CorsFilter.java
    │           ├── MyController.java
    │           └── WebConfig.java
    └── resources
        └── application.properties

2.代码实现

3.测试跨域请求

可以使用Postman或编写简单的JavaScript代码来测试跨域请求。

fetch('http://localhost:8080/greet', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    },
    credentials: 'include'
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

4.验证

四、总结

通过本文,我们详细探讨了 Spring Boot解决跨域问题的三种方法,包括全局配置、使用注解和自定义过滤器。每种方法都有其优缺点,选择哪种方式取决于应用的具体需求和复杂性。

来源:猿java内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯