如何获取Llama API密钥(分步指南)
Kotlin CORS指南:它是什么如何启用它
在本文中,我们将研究 CORS 或跨域资源共享的概念。我们将探索如何使用 Kotlin 在简单的 Spring Boot RESTful Web 服务上启用 CORS。
我们将首先介绍我们的示例项目,这将是我们说明跨源资源共享概念的基础。然后,我们将探讨 CORS 背后的理论、其工作原理以及您可能需要它的原因。最后,我们将修改我们的示例项目以利用跨源资源共享,探讨可能出现问题的某些方式并解决这些问题。
读完这篇文章后,您应该对 CORS 以及它在 Spring Boot 项目中的基本实现有所了解。
我们要强调的是,本文的前提是读者具备 Kotlin 和 Spring Boot 开发堆栈的相关知识。如果不是这样,请查看Spring Boot 指南,获取一些优秀的入门材料。
构建我们的示例项目
好吧,在我们探索跨源资源共享的原理之前,让我们确保您的环境已准备就绪,以便您可以跟随我们。注意:如果您想直接了解理论,请跳至下一节。
我们将首先在 Spring Boot 中构建样板 Web 应用程序。假设您已准备好使用 Java 的环境(拥有 JDK 和可用的 IDE),请继续执行Spring Initializr并设置您的项目。
选择“Spring Web”作为依赖项,选择“Gradle”或“Maven”作为依赖项管理器,选择“Kotlin”作为语言。我们选择“Gradle”作为依赖项管理器。
然后继续下载您的项目。
下载完成后,打开项目。完成此操作后,我们需要添加 apache httpclient库,以便 API 响应我们的请求。
要在 Gradle 中执行此操作,只需将以下行添加到build.gradle文件中的依赖项括号中:
testImplementation 'org.apache.httpcomponents:httpclient'
完成后,您可以运行gradle build,它会将依赖项拉入您的项目中。
现在我们将添加一个 GET 端点作为资源表示,以便对简单请求进行响应。为此,在src/main/kotlin/com/example/demo文件夹中创建一个名为“hello.kt”的资源表示类文件,并输入以下代码:
package com.example.demo
class Hello {
private var id: Int
private var content: String
fun Hello() {
this@hello.id = -1
this@hello.content = ""
}
fun Hello(id: Int, content: String) {
this@hello.id = id
this@hello.content = content
}
fun getId(): Int {
return id
}
fun getContent(): String {
return content
}
}
请注意,我们添加了两个参数,以便在必要时接收额外的数据。
最后,我们需要在 Spring Boot 中添加一个控制器来处理请求。您可以继续在同一目录中创建一个HelloController.kt文件并添加以下代码:
package com.example.demo
import java.util.concurrent.atomic.AtomicLong
import org.springframework.web.bind.annotation.CrossOrigin
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
@RestController
class HelloController {
private val template: String = "Hello, %s!"
private val counter: AtomicInt = AtomicInt()
@GetMapping("/hello")
public fun hello(@RequestParam name: String = "World"): Hello {
System.out.println("==== get greeting ====")
return Hello(counter.incrementAndGet(), String.format(template, name))
}
}
这就是你所需要的。
您可以继续前往此Spring Boot 教程页面,获取有关此特定示例和完整代码的更多信息。
了解 CORS
好的,现在我们已经设置好了项目,让我们来讨论一下 CORS。
CORS,即跨源资源共享,是一种浏览器策略,用于控制浏览器可以从其他来源检索哪些资源。它本质上是一个安全列表,可防止恶意行为者利用 Web 应用程序上的漏洞,从而让用户遭受攻击。
服务器通过包含在所有响应中的 HTTP 标头向浏览器告知 CORS 政策。此标头包含允许浏览器在客户端发出请求并从中检索资源的所有域的列表。
默认情况下,浏览器禁止向目标域以外的域发出请求,因为存在被利用的可能性。考虑到大多数现代网站上执行的请求数量巨大,这一点尤其正确。
此外,这种行为可以充当一张巨大的网络,保护用户免于运行来自潜在恶意来源的代码。
基本的 CORS 标头看起来像这样:
Access-Control-Allow-Origin: https://web.example
您还可以指定有关允许使用的方法、标头和策略max-age的更多属性和限制。
Access-Control-Allow-Origin: https://web.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-TEST, Content-Type
Access-Control-Max-Age: 96000
如果您想深入了解跨域资源共享的细节,我们强烈建议您阅读有关 CORS 的文章,我们在其中进行了更详细的介绍并重点介绍了该技术的实际示例。
在 Spring Boot 中启用 CORS
有两种方法可以在 Spring Boot 应用程序上启用 CORS:更改单个控制器,或进行通用的全局实现。我们将同时实现这两种方法,因此您可以选择最适合自己的方法。
首先,让我们在单独的控制器上实现它。
为了在我们的端点中启用跨域访问,我们首先必须在控制器方法顶部添加@CrossOrigin指令,如下所示:
@RestController
class HelloController {
private val template: String = "Hello, %s!"
private val counter: AtomicInt = AtomicInt()
@CrossOrigin(origins = "http://localhost:8080")
@GetMapping("/hello")
public func hello(@RequestParam name: String = "World"): Hello {
System.out.println("==== get greeting ====")
return Hello(counter.incrementAndGet(), String.format(template, name))
}
}
请注意,我们直接在指令上将来源指定为参数。您可以将一个或多个来源指定为字符串数组。此外,您还可以指定一组与预定义 CORS 规则相对应的参数,例如methods、maxAge和allowedHeaders。
此外,您可以将指令添加到类级别,以在类本身中定义的所有端点上强制执行 CORS。
对于应用程序范围的 CORS 实现,我们将更改@GetMapping指令来实现过滤器。
@RestController
class HelloController {
private val template: String = "Hello, %s!"
private val counter: AtomicInt = AtomicInt()
@GetMapping("/hello-javaconfig")
public fun hello(@RequestParam name: String = "World"): Hello {
System.out.println("==== get greeting ====")
return Hello(counter.incrementAndGet(), String.format(template, name))
}
}
请注意,唯一的变化是在映射字符串中。
然后我们将转到我们的主要应用程序类(在我们的例子中为 DemoApplication.kt),并添加以下 WebMVCConfigurer:
@Bean
public fun corsConfigurer(): WebMvcConfigurer {
return WebMvcConfigurer() {
@Override
public fun addCorsMappings(CorsRegistry registry): Void {
registry.addMapping("/hello-javaconfig").allowedOrigins("http://localhost:8080")
}
}
}
在这里我们可以相应地指定我们的 CORS 来源和规则。
请记住,您可以同时使用这两种方法。如果您的应用程序需要更复杂、更精密的 CORS 策略,这种方法会更有优势。
就这样。您已经拥有 CORS 实现。
面临 CORS 问题
实施 CORS 相对简单且易于管理。在大多数情况下,您需要的大部分信息都可以通过您选择的浏览器中的开发人员工具获得。此外,Chrome Lighthouse等工具可让您检查开发环境中的网络行为并建议如何实施这些政策。
您可能担心在添加 CORS 的过程中会破坏您的网站,但不必担心。只要您在临时环境中继续操作并密切关注网络流量工具显示的内容,您就没问题。查找干扰平台正常流程的缺失来源或违规规则非常简单。
解决 CORS 问题就是找到罪魁祸首并调整我们的指令的游戏。
最后的想法
当然,我们知道,在大多数情况下,现代网络需要向不同的来源发出请求。这是让开发人员能够提供最佳和最可靠体验的主要因素。当今时代我们认为理所当然的许多功能都源于网络的互操作性和紧密连接。因此,跨源资源共享等机制已被设想出来以满足这些需求并提供强大的安全性和稳定性。