首页app软件go语言微服务 Go语言服务器如何处理带自定义请求头的CORS预检请求

go语言微服务 Go语言服务器如何处理带自定义请求头的CORS预检请求

圆圆2025-11-30 00:00:23次浏览条评论

Go语言服务器如何处理带自定义请求头的CORS预检请求

本文详细阐述了在angularjs中,当使用自定义请求头(如`authorization`)发起式跨域获取请求时,go语言服务器如何正确处理器发送的cors预检(选项)请求。核心问题是服务器未能显着响应预检请求,导致404错误。教程将提供去服务器的理解CORS与应用预检请求

跨域资源共享(CORS)是一种安全,允许Web应用程序从不同域名的服务器请求决策机制。当浏览器检测到跨域请求时,会根据请求的复杂性采取不同的策略。

简单请求:满足特定条件的GET、HEAD或POST请求,并且只使用安全的首部字段(如Accept、Accept-Language、Content-Language、Content-Type为application) /x-www-form-urlencoded、multipart/form-data或text/plain)。此类请求会直接发送,服务器响应中包含Acces s-Control-Allow-Origin等CORS头。

非简单请求:如果请求方法不是GET、HEAD、POST,或者使用了非安全的头部字段(例如自定义的Authorization头),或者Content-Type是application/json等,浏览器会先发送一个预检请求(Preflight)

预检请求使用HTTP的OPTION目的是询问服务器是否允许实际的跨域请求。预检请求会提出以下关键头部:

立即学习“go语言免费学习笔记(深入)”;Access-Control-Request-Method:指明实际请求将使用的HTTP方法(如GET)。Access-Control-Request-Headers:指明实际请求将带的头部(如Authorization)。Origin:指明请求的来源域名。

服务器收到OPTIONS预检请求后,需要响应200 OK: Access-Control-Allow-Origin,例如:Access-Control-Allow-Origin :允许的来源域名。Access-Control-Allow-Methods:允许的HTTP方法。Access-Control-Allow-Headers:允许的自定义请求头。Access-Control-Max-Age:预检请求结果的缓存时间。

如果服务器的预检响应允许了后续的实际请求,浏览器会发,否则,浏览器将阻止实际请求并发出CORS错误。

问题诊断:AngularJS 与 Go 服务器的 CORS 挑战

在给定的场景中,AngularJS 客户端使用 $h ttp.get 发起请求,并添加了自定义的授权头:$http.get(env.apiURL() '/banks', { headers: { 'Authorization': 'Bearer ' localStorageService.get('access_token') }})登录后复制

由于存在自定义的授权头,浏览OPTIONS: OPTIONS: OPTIONS: OPTIONS: OPTIONS: OPTIONS: OPTIONS /banks HTTP/1.1Host: localhost:8080...Access-Control-Request-Method: GETOrigin: http://localhost:8081Access-Control-Request-Headers:accept,授权...登录后复制

然而,Go服务器的响应却是404 Not Found: HTTP/1.1 404 Not FoundAccess-Control-Allow-Headers: Accept, Content-Type, Content-Length, Accept-Encoding, charset=utf-8Date: Mon: 17 Mar 2014 11:05:20 GMTContent-Length: 19 登录后复制

正在运送 rol-Allow-Headers 和 Access-Control-Allow-Origin),但 404 Not Found的状态码本身就表明服务器未能成功处理该请求。

问题根源依赖Go服务器的路由配置:Zevi AI

一个针对电子商务品牌的AI搜索引擎的服务,帮助他们的客户轻松找到想要的东西 88查看详情 r := mux.NewRouter()r.HandleFunc(quot;/banksquot;, RetrieveAllBank).Methods(quot;GETquot;)http.ListenAndServe(quot;:8080quot;, r)登录后复制

mux.Router只为/banks路径注册了一个GET方法处理器。当OP TIONS请求到达时,mux.Router找不到匹配OPTIONS方法的/banks路由,返回404 Not Found。即使在路由设置了CORS响应头,404状态码也导致浏览器认为预检请转至: OPTIONS请求

为了解决这个问题,我们需要修改Go服务器,能够设置显式地拦截并处理O PTIONS预检请求。这可以通过创建一个自定义的http.Handler包装器来实现。

首先,定义一个结构体来包装mux.Router:package mainimport ( quot;fmtquot; quot;github.net/gorilla/muxquot; quot;net/httpquot;)// MyServer // 1.设置CORS响应头 //确保只为允许的源设置CORS头,增强安全性 allowedOrigin:= quot;http://localhost:8081quot; //示例:实际应用中应配置 if origin := req.Header.Get(quot;Originquot;); origin == allowedOrigin { rw.Header().Set(quot;Access-Control-Allow-Originquot;, origin) rw.Header().Set(quot;Access-Control-Allow-Methodsquot;, quot;POST, GET, OPTIONS, PUT, DELETEquot;) // 保证这里已经订购了所有客户端可能发送的自定义请求头 rw.Header().Set(quot;Access-Control-Allow-Headersquot;, quot;Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorizationquo​​t;) rw.Header().Set(quot;Access-Control-Max-Agequot;, quot;86400quot;) // 存储预检结果24小时 } else { //对于不允许的来源,可以选择不设置CORS头或返回错误 //这里简单演示,实际应用中可能需要更复杂的逻辑 // rw.WriteHeader(http.StatusForbidden) // return } // 2.拦截并处理OPTIONS预检请求 // If req.Method == quot;OPTIONSquot; { rw.WriteHeader(http.StatusOK) // // RetrieveAllBank是处理GET /banks请求的函数 func Retrie

veAllBank(rw http.ResponseWriter, req *http.Request) { // 实际业务逻辑 fmt.Fprintf(rw, quot;检索所有银行数据! quot;)}func main() { r := mux.NewRouter() r.HandleFunc(quot;/banksquot;, RetrieveAllBank).Methods(quot;GETquot;) // 使用 MyServer 包装 mux.Router 服务器的概念:= amp;MyServer{r} fmt.Println(quot;服务器监听:8080quot;) http.ListenAndServe(quot;:8080quot;, server) // 监听并使用MyServer}登录后复制

代码解析:MyServer结构体:它包含一个*mux.Router实例,使得我们可以利用mux的路由功能。ServeHTTP方法:是实现http.Handler接口的关键。所有进入http ListenAndServe的请求首先会经过这个方法。设置CORS头部:在请求中。 Access-Control-Allow-Methods和Access-Control-Allow-Headers等CORS相关响应头。头部被正确处理。拦截OPTIONS请求:if req.Method == 200 OK状态码,然后返回。这就阻止了OPTIONS请求继续被mux.Router处理,避免了404错误。转发其他请求:对于非OPTIONS的请求(如实际的GET请求),用s.r.ServeHTTP(rw) req),将请求队列底层的mux.Router进行正常的路由处理。ma in函数:将mux.Router实例打包到MyServer中,将其作为参数传递给http.ListenAndServe。

通过上述修改,当浏览器发送OPTIONS预检请求时,服务器会正​​确响应200 OK,从而允许浏览器继续发送实际的GET请求。注意事项与最佳

CORS中间件:对于更复杂的Go应用,手动实现Serve HTTP m/rs/cors。这些库提供了更灵活的配置选项,能够更好地处理各种 CORS 场景。

// 示例:使用github.com/rs/corspackage mainimport ( quot;fmtquot; quot;github.com/gorilla/muxquot; quot;github.com/rs/corsquot; // 导入cors库 quot;net/httpquot;)func RetrieveAllBank(rw http.ResponseWriter, req *http.Request) { fmt.Fprintf(rw, quot;检索所有银行data!quot;)}func main() { r := mux.NewRouter() r.HandleFunc(quot;/banksquot;, RetrieveAllBank).Methods(quot;GETquot;) // 配置CORS选项 c := cors.New(cors.Options{ AllowedOrigins: []string{quot;http://localhost:8081quot;}, // 允许的来源 AllowedMethods: []string{“GET”;,“POST”;, quot;PUTquot;, quot;DELETEquot;, quot;OPTIONSquot;}, // 允许的方法AllowedHeaders: []string{quot;Acceptquot;, quot;Content-Typequot;, quot;Authorizationquo​​t;}, // 允许的头AllowCredentials: true, // 允许携带认证信息(如cookies,HTTP认证及客户端SSL说明) MaxAge: 86400, // (((quot) 服务器监听) on :8080quot;) http.ListenAndServe(quot;:8080quot;, handler)}登录后复制

Access-Control-Allow-Headers的危害:务必确保Access-Control-Allow-Headers er头,预检请求仍会失败。

Access-Control-Allow-Or登录的安全性:在生产环境中,Access-Control-Allow-Orig in: HTTP http/1.1能够进行标准化(例如将授权转换为授权)。

务器在解析请求头和设置响应头时,应遵循常见的规范(例如授权),但内部处理时通常不太依赖于特定的字母大小写。总结式

当Web AngularJS)发起标记自定义请求头的跨域请求时,浏览器会首先发送一个OPTIONS:Go语言服务器必须地处理这个预检请求,返回200 OK状态码并包含正确的CORS头部信息,才能允许后续的实际请求。通过实现自定义的http.Handler包装器或使用专业的CORS中间件,可以有效地解决Go服务器在处理CORS预检请求时遇到的404 Not Found问题,确保跨域通信的中间进行。

以上就是Go语言服务器如何联系我们了解更多关于CORS的信息相关标签: js git json go github cookie 处理器 go go 都在语言大家看: Revel如何在Golang中实现静态资源管理Golang如何构建小型在线表格系统

Go语言服务器如何处
狗狗币怎么买最安全呢?狗狗币安全购买渠道APP推荐
相关内容
发表评论

游客 回复需填写必要信息