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
}
}

請注意,我們添加了兩個參數(shù),以便在必要時接收額外的數(shù)據(jù)。

最后,我們需要在 Spring Boot 中添加一個控制器來處理請求。您可以繼續(xù)在同一目錄中創(chuàng)建一個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))
}
}

這就是你所需要的。

您可以繼續(xù)前往此Spring Boot 教程頁面,獲取有關(guān)此特定示例和完整代碼的更多信息。

了解 CORS

好的,現(xiàn)在我們已經(jīng)設(shè)置好了項(xiàng)目,讓我們來討論一下 CORS

CORS,即跨源資源共享,是一種瀏覽器策略,用于控制瀏覽器可以從其他來源檢索哪些資源。它本質(zhì)上是一個安全列表,可防止惡意行為者利用 Web 應(yīng)用程序上的漏洞,從而讓用戶遭受攻擊。

服務(wù)器通過包含在所有響應(yīng)中的 HTTP 標(biāo)頭向?yàn)g覽器告知 CORS 政策。此標(biāo)頭包含允許瀏覽器在客戶端發(fā)出請求并從中檢索資源的所有域的列表。

默認(rèn)情況下,瀏覽器禁止向目標(biāo)域以外的域發(fā)出請求,因?yàn)榇嬖诒焕玫目赡苄???紤]到大多數(shù)現(xiàn)代網(wǎng)站上執(zhí)行的請求數(shù)量巨大,這一點(diǎn)尤其正確。

此外,這種行為可以充當(dāng)一張巨大的網(wǎng)絡(luò),保護(hù)用戶免于運(yùn)行來自潛在惡意來源的代碼。

基本的 CORS 標(biāo)頭看起來像這樣:

Access-Control-Allow-Origin: https://web.example

您還可以指定有關(guān)允許使用的方法、標(biāo)頭和策略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

如果您想深入了解跨域資源共享的細(xì)節(jié),我們強(qiáng)烈建議您閱讀有關(guān) CORS 的文章,我們在其中進(jìn)行了更詳細(xì)的介紹并重點(diǎn)介紹了該技術(shù)的實(shí)際示例。

在 Spring Boot 中啟用 CORS

有兩種方法可以在 Spring Boot 應(yīng)用程序上啟用 CORS:更改單個控制器,或進(jìn)行通用的全局實(shí)現(xiàn)。我們將同時實(shí)現(xiàn)這兩種方法,因此您可以選擇最適合自己的方法。

首先,讓我們在單獨(dú)的控制器上實(shí)現(xiàn)它。

為了在我們的端點(diǎn)中啟用跨域訪問,我們首先必須在控制器方法頂部添加@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))
}
}

請注意,我們直接在指令上將來源指定為參數(shù)。您可以將一個或多個來源指定為字符串?dāng)?shù)組。此外,您還可以指定一組與預(yù)定義 CORS 規(guī)則相對應(yīng)的參數(shù),例如methods、maxAgeallowedHeaders。

此外,您可以將指令添加到類級別,以在類本身中定義的所有端點(diǎn)上強(qiáng)制執(zhí)行 CORS。

對于應(yīng)用程序范圍的 CORS 實(shí)現(xiàn),我們將更改@GetMapping指令來實(shí)現(xiàn)過濾器。

@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))
}
}

請注意,唯一的變化是在映射字符串中。

然后我們將轉(zhuǎn)到我們的主要應(yīng)用程序類(在我們的例子中為 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")
}
}
}

在這里我們可以相應(yīng)地指定我們的 CORS 來源和規(guī)則。

請記住,您可以同時使用這兩種方法。如果您的應(yīng)用程序需要更復(fù)雜、更精密的 CORS 策略,這種方法會更有優(yōu)勢。

就這樣。您已經(jīng)擁有 CORS 實(shí)現(xiàn)。

面臨 CORS 問題

實(shí)施 CORS 相對簡單且易于管理。在大多數(shù)情況下,您需要的大部分信息都可以通過您選擇的瀏覽器中的開發(fā)人員工具獲得。此外,Chrome Lighthouse等工具可讓您檢查開發(fā)環(huán)境中的網(wǎng)絡(luò)行為并建議如何實(shí)施這些政策。

您可能擔(dān)心在添加 CORS 的過程中會破壞您的網(wǎng)站,但不必?fù)?dān)心。只要您在臨時環(huán)境中繼續(xù)操作并密切關(guān)注網(wǎng)絡(luò)流量工具顯示的內(nèi)容,您就沒問題。查找干擾平臺正常流程的缺失來源或違規(guī)規(guī)則非常簡單。

解決 CORS 問題就是找到罪魁禍?zhǔn)撞⒄{(diào)整我們的指令的游戲。

最后的想法

當(dāng)然,我們知道,在大多數(shù)情況下,現(xiàn)代網(wǎng)絡(luò)需要向不同的來源發(fā)出請求。這是讓開發(fā)人員能夠提供最佳和最可靠體驗(yàn)的主要因素。當(dāng)今時代我們認(rèn)為理所當(dāng)然的許多功能都源于網(wǎng)絡(luò)的互操作性和緊密連接。因此,跨源資源共享等機(jī)制已被設(shè)想出來以滿足這些需求并提供強(qiáng)大的安全性和穩(wěn)定性。 

文章來源:Kotlin CORS Guide: What It Is and How to Enable It

上一篇:

12個AWS IAM安全最佳實(shí)踐

下一篇:

Kotlin CSRF保護(hù)指南:示例和如何啟用它
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費(fèi)