Spring MVC 与 CORS跨域的详细介绍

Spring MVC 与 CORS跨域的详细介绍

在Web开发中,跨域请求是一种常见的需求。CORS(Cross-Origin Resource Sharing)是一种机制,它允许Web应用程序从不同的域访问其资源。本文将详细介绍Spring MVC与CORS跨域的相关知识,并提供两个示例说明。

CORS跨域的实现原理

CORS跨域的实现原理是通过在HTTP响应头中添加Access-Control-Allow-Origin字段来实现的。当浏览器发现请求的响应头中包含Access-Control-Allow-Origin字段时,它会允许跨域请求。如果响应头中没有包含Access-Control-Allow-Origin字段,浏览器将拒绝跨域请求。

Spring MVC中的CORS跨域配置

在Spring MVC中,我们可以通过添加@CrossOrigin注解或配置CorsFilter来实现CORS跨域。下面分别介绍这两种方式的实现方法。

使用@CrossOrigin注解实现CORS跨域

@CrossOrigin注解是Spring MVC提供的一种简单的方式来实现CORS跨域。我们可以在Controller类或方法上添加@CrossOrigin注解来允许跨域请求。下面是一个使用@CrossOrigin注解实现CORS跨域的示例:

@RestController
@RequestMapping("/api")
public class ApiController {

    @CrossOrigin(origins = "http://localhost:8080")
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

在上面的示例中,我们在ApiController类的hello方法上添加了@CrossOrigin注解,并指定了允许跨域请求的源地址为"http://localhost:8080"。

使用CorsFilter实现CORS跨域

除了使用@CrossOrigin注解外,我们还可以通过配置CorsFilter来实现CORS跨域。下面是一个使用CorsFilter实现CORS跨域的示例:

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

在上面的示例中,我们创建了一个名为CorsConfig的配置类,并在其中定义了一个名为corsFilter的CorsFilter对象。在corsFilter对象中,我们使用UrlBasedCorsConfigurationSource类来配置CORS跨域,允许所有来源、所有请求头和所有请求方法。

示例

以下是两个示例演示如何在Spring MVC中实现CORS跨域:

示例一

  1. 创建一个名为spring-mvc-demo的Maven项目。

  2. 创建一个名为ApiController的Controller类。

@RestController
@RequestMapping("/api")
public class ApiController {

    @CrossOrigin(origins = "http://localhost:8080")
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

在上面的示例中,我们创建了一个名为ApiController的Controller类,并使用@RestController注解标记它。在Controller中,我们使用@CrossOrigin注解来允许跨域请求,并使用@GetMapping注解标记处理GET请求的方法。

  1. 创建一个名为index.html的HTML文件。
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Spring MVC CORS Demo</title>
</head>
<body>
    <button onclick="sendRequest()">Send Request</button>
    <script>
        function sendRequest() {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'http://localhost:8081/api/hello');
            xhr.onload = function() {
                alert(xhr.responseText);
            };
            xhr.send();
        }
    </script>
</body>
</html>

在上面的示例中,我们创建了一个名为index.html的HTML文件,并在其中添加了一个按钮和一个JavaScript函数。当用户点击按钮时,JavaScript函数会发送一个跨域请求,并弹出响应结果。

  1. 启动应用程序并访问index.html文件。

在上面的示例中,我们使用8081端口启动应用程序,并访问index.html文件。当用户点击按钮时,JavaScript函数会发送一个跨域请求,并弹出响应结果。

示例二

  1. 创建一个名为spring-mvc-demo的Maven项目。

  2. 创建一个名为ApiController的Controller类。

@RestController
@RequestMapping("/api")
public class ApiController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

在上面的示例中,我们创建了一个名为ApiController的Controller类,并使用@RestController注解标记它。在Controller中,我们使用@GetMapping注解标记处理GET请求的方法。

  1. 创建一个名为CorsConfig的配置类。
@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

在上面的示例中,我们创建了一个名为CorsConfig的配置类,并在其中定义了一个名为corsFilter的CorsFilter对象。在corsFilter对象中,我们使用UrlBasedCorsConfigurationSource类来配置CORS跨域,允许所有来源、所有请求头和所有请求方法。

  1. 创建一个名为index.html的HTML文件。
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Spring MVC CORS Demo</title>
</head>
<body>
    <button onclick="sendRequest()">Send Request</button>
    <script>
        function sendRequest() {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', 'http://localhost:8081/api/hello');
            xhr.onload = function() {
                alert(xhr.responseText);
            };
            xhr.send();
        }
    </script>
</body>
</html>

在上面的示例中,我们创建了一个名为index.html的HTML文件,并在其中添加了一个按钮和一个JavaScript函数。当用户点击按钮时,JavaScript函数会发送一个跨域请求,并弹出响应结果。

  1. 启动应用程序并访问index.html文件。

在上面的示例中,我们使用8081端口启动应用程序,并访问index.html文件。当用户点击按钮时,JavaScript函数会发送一个跨域请求,并弹出响应结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring MVC 与 CORS跨域的详细介绍 - Python技术站

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

相关文章

  • 解决hibernate+mysql写入数据库乱码

    针对解决hibernate+mysql写入数据库乱码的问题,我们可以分为以下几步进行解决。 1. 确认数据库编码格式 首先我们需要确认数据库表的编码格式。假设我们的数据库表为student,我们可以使用以下SQL语句来查看该表的编码格式: SHOW CREATE TABLE student; 我们可以从查询结果中获取到该表的编码格式,例如utf8mb4。 2…

    Java 2023年5月20日
    00
  • 解决SpringSecurity 一直登录失败的问题

    对于SpringSecurity一直登录失败的问题,我们可以从以下几个方面来进行排查和解决。 1.检查用户名和密码是否正确 登录失败的常见原因之一是用户名和密码不正确。我们可以通过查看用户表或者日志来检查用户输入的用户名和密码是否与系统中保存的用户名和密码匹配。如果不匹配,则登录失败。另外,如果程序使用了加密算法对密码进行加密,我们还需要检查用户输入的密码是…

    Java 2023年5月20日
    00
  • Hibernate使用hbm.xml配置映射关系解析

    Hibernate是Java平台上的一个对象/关系映射框架,常用于在Java应用程序中访问和管理数据库。在Hibernate中,我们需要使用映射文件将Java对象与数据库表进行映射。其中,hbm.xml文件作为Hibernate映射文件的一种形式,是一种XML格式的文件,这个文件用来描述Java对象与数据库表之间的映射关系。本文将详细讲解如何使用hbm.xm…

    Java 2023年5月20日
    00
  • 详解Java线程-守护线程与用户线程

    详解Java线程-守护线程与用户线程 前言 多线程编程是Java中很重要的一部分,而线程分为两种类型:用户线程和守护线程。本文将着重介绍守护线程的概念、用法和示例,希望通过本文的学习,可以更好的理解Java线程。 什么是守护线程 守护线程是Java线程中的一种特殊线程,与用户线程的区别在于:守护线程不会阻止JVM的停止,当JVM没有用户线程运行时,即便还有守…

    Java 2023年5月19日
    00
  • Spring Security 表单登录功能的实现方法

    下面为您讲解Spring Security表单登录功能的实现方法: 1. 配置Spring Security 在pom文件中添加依赖: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security…

    Java 2023年5月20日
    00
  • 一文搞懂Spring Security异常处理机制

    下面我将详细讲解“一文搞懂Spring Security异常处理机制”的完整攻略。 1. 什么是Spring Security异常处理机制 Spring Security异常处理机制是指Spring Security在运行过程中遇到异常时的处理方式,它是构建Spring Security安全体系的重要部分。Spring Security将异常处理机制交给了一…

    Java 2023年6月3日
    00
  • MyBatis拦截器原理探究

    我会为您详细讲解”Mybatis拦截器原理探究”的完整攻略,希望能帮到您。 一、前言 当我们使用 Mybatis 进行开发时,可能会有这样一种需求:在执行 SQL 之前、之后对 SQL 语句或参数进行处理,比如动态修改 SQL 语句,打印执行 SQL 的日志、记录执行时间等等,这时,Mybatis 的拦截器就派上用场了。 二、Mybatis 的拦截器 Myb…

    Java 2023年5月20日
    00
  • java实现接口的典型案例

    Java使用接口来定义接口规范和实现类之间的约定。接口指定的方法是在实现类中要实现的。下面是Java实现接口的典型案例的完整攻略。 1. 定义接口 首先,在Java中定义接口使用interface关键字。接口定义了一堆方法,但是不会实现这些方法。下面的截图是一个简单的MyInterface接口的例子。 public interface MyInterface…

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