[gogf/gf]升级到1.11.6之后中间件无法处理OPTIONS请求

2024-06-25 788 views
8

route file:

func corsHandler(r *ghttp.Request) {
    r.Response.CORSDefault()

        //统一处理options请求 解决cors接口的问题
    switch r.Method {
    case "OPTIONS":
        r.Response.WriteStatus(200, "")
        lib_response.Json(r, 0, "OPTIONS REQUEST SUCCESS")
        r.ExitAll()
    }

    r.Middleware.Next()
}

func init() {
    s := g.Server()

    s.BindMiddlewareDefault(corsHandler)

    s.Group("/api", func(group *ghttp.RouterGroup) {
        // ..         
         }
}

如代码所示,升级到1.11.6之后所有options请求都404了,无法响应。 1.11.5及之前多个版本没有问题。 尝试查看源码无法自己解决问题。请问我该如何修改这部分代码呢?

回答

6

@lijingbo8119 你好,OPTIONS请求本身是对请求URI的预请求,判断对应的URI是否存在且当前有调用权限。新版本增加对OPTIONS请求时对路由匹配的检索,如果找不到路由则会返回404,这是正常的服务逻辑。请问你有什么特殊的需求吗?没有匹配到的服务路由为何也要返回成功?

0

你好~ 在构建跨域restful接口时,put patch delete等请求类型的接口会前置一个options请求判断cors是否允许。 我在中间件逻辑中拦截所有options请求返回固定值为了让后续的逻辑请求(put patch delete)正常放行。

9

@lijingbo8119 你这样将OPTIONS的预请求全部强制成功返回但是后端没有检测到服务接口啊,这样做不太合理撒?

5

但是需要将OPTIONS请求都返回200,其他请求才可以正常接收。获取每个请求前面都要定义一个同样pattern的OPTIONS? like this:

s.Group("/api", func(group *ghttp.RouterGroup) {
        group.OPTIONS("users", returnEmptyHandler)
        group.POST("users", someHandler)
        group.OPTIONS("users/{id}", returnEmptyHandler)
        group.PUT("users/{id}", someHandler)
        group.DELETE("users/{id}", someHandler)

        group.OPTIONS("news", returnEmptyHandler)
        group.POST("news", someHandler)
        group.OPTIONS("news/{id}", returnEmptyHandler)
        group.PUT("news/{id}", someHandler)
        group.DELETE("news/{id}", someHandler)

        // ..
    })
4

貌似这样OPTIONS也返回404了

0

@lijingbo8119 你的OPTIONS请求是怎么发送的?浏览器?Postman?还是curl?一般来说预请求的Header里面会有Access-Control-Request-Method这个字段,表示接下来要发起的HTTP Method请求,我怀疑你的Header里面没有。你正常通过AJAX请求试试呢? image

5

OPTIONS都是请求put之前浏览器自动发出的。 以下截图为新版edge的截图(chrome看不到options了)。

func init() {
    s := g.Server()

    s.BindMiddlewareDefault(func(r *ghttp.Request) {
        r.Response.CORSDefault()
        r.Middleware.Next()
    })

    s.Group("/api", func(group *ghttp.RouterGroup) {
        group.GET("areas", funcIndex)
        group.GET("areas/{id}", funcShow)
        group.POST("areas", funcStore)
        group.PUT("areas/{id}", funcUpdate)
        group.DELETE("areas/{id}", funcDestroy)
                 // 无论哪个版本 注册的OPTIONS请求都进不去
        group.OPTIONS("areas/{id}", func(r *ghttp.Request) {
            panic("can't get here")
        })
    })
}

路由注册: image

1.11.5:

2020-03-17 13:40:07.246 200 "OPTIONS http localhost:9528 /api/areas/1?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJcEFkZHJlc3MiOiIiLCJJc3N1ZVRpbWVzdGFtcCI6MTU4NDQyMzQzMCwiTW9iaWxlIjoxNTU5ODI1OTkyMiwiVGVhbUlkIjoxLCJVc2VySWQiOjEzfQ.etDkPMAABIy9o4ML3DArmZNEFpBRUUaQiQQqDUuBag8 HTTP/1.1" 0.000, [::1], "http://localhost:8080/", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 Edg/80.0.361.66"

image

1.11.6:

2020-03-17 13:40:32.518 404 "OPTIONS http localhost:9528 /api/areas/1?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJcEFkZHJlc3MiOiIiLCJJc3N1ZVRpbWVzdGFtcCI6MTU4NDQyMzQzMCwiTW9iaWxlIjoxNTU5ODI1OTkyMiwiVGVhbUlkIjoxLCJVc2VySWQiOjEzfQ.etDkPMAABIy9o4ML3DArmZNEFpBRUUaQiQQqDUuBag8 HTTP/1.1" 0.000, [::1], "http://localhost:8080/", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 Edg/80.0.361.66"

image

6

@lijingbo8119 好的,我大概明白了,这是一个bug,先不升级。

4

@lijingbo8119 你试下最新的master分支。