Spring MVC 与 CORS跨域的详细介绍

yizhihongxing

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日

相关文章

  • Java中空指针异常该如何避免详解

    为了避免Java中空指针异常(NullPointerException),我们可以采取下面的措施。 1.使用安全调用运算符(?.) 在Java 8中引入了安全调用运算符(?.), 它是一种简单的方式来避免NullPointerException异常。 例如,如果我们使用“dog?.bark()”调用“bark()”方法,那么当dog为null时,它仍将返回n…

    Java 2023年5月27日
    00
  • chatgpt java环境调用源码实现demo

    下面是详细讲解chatgpt java环境调用源码实现demo的完整攻略: 简介 ChatGPT是一个基于开源机器学习模型GPT和transformer的Python库,可用于生成和解决各种自然语言处理问题。在Java环境中调用ChatGPT Python库将为开发人员提供API服务的能力。本文将提供一个实际的demo,介绍如何在Java应用程序中使用Cha…

    Java 2023年5月26日
    00
  • 简单了解JAVA构造方法

    简单了解JAVA构造方法 什么是构造方法 Java中每个类都有构造方法,构造方法是用来初始化对象的方法,即在使用new操作符创建对象时调用的一种特殊方法。构造方法与类名相同,无需返回类型,且不能被重载。 构造方法的特点 构造方法名要与类名相同,且区分大小写; 构造方法没有返回值类型; 构造方法没有具体的返回值,但需要使用return语句结束构造方法; 构造方…

    Java 2023年5月26日
    00
  • 面向对象编程依赖注入详解

    面向对象编程依赖注入详解 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种在面向对象编程中,将类间依赖关系的创建和管理权交给其他专门的类来处理的技术。通俗的说,就是让调用类摆脱创建和管理被调用类对象的束缚,将创建和管理依赖对象的工作交给容器来完成。 DI的优点 降低了系统模块间的耦合度。 可以提高模块的可重用性、可测试性和…

    Java 2023年5月26日
    00
  • Java获得一个数组的指定长度排列组合算法示例

    下面详细讲解一下Java获得一个数组的指定长度排列组合算法示例的完整攻略。 算法说明 在程序设计中,经常会遇到需要从给定的元素集合中去选取一些元素,这些元素能组成的各种可能长度的排列和组合集合。这时候,排列和组合问题就变得特别重要。在Java中,提供了一些工具类帮助我们解决这些问题。 排列和组合的定义 排列问题中,给定n个元素,从中选取k个元素进行排列,若n…

    Java 2023年5月26日
    00
  • Spring AOP基本概念

    下面是关于Spring AOP基本概念的完整攻略。 1. 什么是AOP AOP(Aspect-Oriented Programming),即面向切面编程,是OOP(Object-Oriented Programming)的一种扩展。OOP需要在类中定义方法,在方法中编写业务逻辑代码。而AOP则通过预先定义好的切面将所有对象的横切关注点分离出来,然后统一交给切…

    Java 2023年5月19日
    00
  • jsp中页面间传汉字参数转码的方法

    在JSP中传递汉字参数可能会出现乱码问题,这是因为浏览器和服务器之间默认采用的字符集不同。为了解决这个问题,我们可以采用如下的方法进行解决。 一、设置请求和响应的编码方式 可以在JSP页面中设置请求和响应的编码方式,代码如下: <%@ page language="java" contentType="text/html;…

    Java 2023年6月15日
    00
  • finalize()方法的作用是什么?

    finalize()方法是Java Object类中的一个方法,用于回收被垃圾回收器标记为“可回收”的对象。当一个对象被垃圾回收器确定为“可回收”的时候,会在对象被清除之前调用finalize()方法。该方法的作用是释放对象占用的资源,比如关闭文件、释放外部资源等。 以下是示例说明: 使用finalize()方法释放文件资源 public class Fil…

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