最近在拿go寫一個(gè)小工具,web方向,只用了net/http基礎(chǔ)框架。在使用過程中遇到了跨域問題。
。。。。。。
中間我就不bb了,直接記錄代碼
//定義中間件
func CrosMiddleware(handler http.HandlerFunc) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*") // 指明哪些請求源被允許訪問資源,值可以為 "*","null",或者單個(gè)源地址。
w.Header().Set("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token") //對于預(yù)請求來說,指明了哪些頭信息可以用于實(shí)際的請求中。
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS") //對于預(yù)請求來說,哪些請求方式可以用于實(shí)際的請求。
w.Header().Set("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") //對于預(yù)請求來說,指明哪些頭信息可以安全的暴露給 CORS API 規(guī)范的 API
w.Header().Set("Access-Control-Allow-Credentials", "true") //指明當(dāng)請求中省略 creadentials 標(biāo)識時(shí)響應(yīng)是否暴露。對于預(yù)請求來說,它表明實(shí)際的請求中可以包含用戶憑證。
//放行所有OPTIONS方法
if r.Method == "OPTIONS" {
w.WriteHeader(200)
return
}
handler.ServeHTTP(w, r)
})
}
//具體使用
func StartSocket() {
http.Handle("/login", service.CrosMiddleware(service.Login))
log.Println("Serving at localhost:8000...")
log.Fatal(http.ListenAndServe(":8000", nil))
}
說穿了,他是在瀏覽器使用options訪問的時(shí)候,對response的header進(jìn)行幾個(gè)屬性值進(jìn)行修改