gin跨域(CROS)时GET和POST正常但PUT和DELETE被阻止
问题表现
同一个项目请求同一个服务时,Get和Post请求正常,但是Put和Delete一直报跨域错误的问题
Access to XMLHttpRequest at 'http://127.0.0.1:8011/api/organization' from origin 'http://localhost:9527' has been blocked by CORS policy: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.
解决方案
根据问题描述,很清楚是PUT
方法不行,于是去查看服务端的跨域中间件, 发现没有在Header中明确指定Access-Control-Allow-Headers
,于是添加Allow Methods的设置,, 以下是完整的跨域中间件:
package middleware
import (
"net/http"
"github.com/gin-gonic/gin"
)
func CORSMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
ctx.Writer.Header().Set("Access-Control-Max-Age", "86400")
ctx.Writer.Header().Set("Access-Control-Allow-Headers", "*")
ctx.Writer.Header().Set("Access-Control-Allow-Methods", "*") //出问题是缺少这里
ctx.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
if ctx.Request.Method == http.MethodOptions {
ctx.AbortWithStatus(200)
} else {
ctx.Next()
}
}
}
反思
问题本身没有什么,但有意思的是过程,因为我先写的服务端,且确定加了跨域的中间件,且在写前端的时候,之前常用的Get和Post访问都没有出现跨域的问题,所以问题出现时,没有第一时间联系到时服务端的问题。
网上查了些信息,整体描述是因为Get和Post的方法是默认的,所以及时没有明确设置也可以通过,但是其他的方法就需要显示的设置。
热门相关:最强狂兵 第一神算:纨绔大小姐 大神你人设崩了 薄先生,情不由己 网游之逆天飞扬