
掌握ChatGPT插件與自定義GPT
請注意,我們添加了兩個參數(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)此特定示例和完整代碼的更多信息。
好的,現(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 應(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、maxAge和allowedHeaders。
此外,您可以將指令添加到類級別,以在類本身中定義的所有端點(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)。
實(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