faygo框架的跨域(支持cookie)解决办法

关于跨域的说明,请参考 http://www.ruanyifeng.com/blog/2016/04/cors.html

更新:作者已更新cross_origin.go,新的写法是:

frame.NamedAPI("QueryMenuList","GET OPTIONS","/api/v1/webs/get/query_menu_list", webs.QueryMenuList()).Use(tgMiddleware.CrossOrigin)

下面是基于网友畅雨的解决办法整理出来的。

1、router路由中,需要添加OPTIONS的处理方法

tgMiddleware "github.com/henrylee2cn/faygo/ext/middleware"

// QueryMenuList

frame.NamedAPI("QueryMenuList","GET","/api/v1/webs/get/query_menu_list", webs.QueryMenuList()).Use(tgMiddleware.CrossOrigin)

frame.NamedOPTIONS("QueryMenuList","/api/v1/webs/get/query_menu_list", webs.DelwithOptions()).Use(tgMiddleware.CrossOrigin)

2、api webs处理单元中,增加方法 DelwithOptions,对应执行OPTIONS请求的处理

func DelwithOptions() faygo.HandlerFunc {

    return func(c *faygo.Context) error{

        return nil

    }

}

3、faygo自带的middleware cross_origin.go 中,需要修改成

// CrossOrigin creates Cross-Domain middleware

var CrossOrigin = faygo.HandlerFunc(func(ctx *faygo.Context) error {

  ctx.SetHeader(faygo.HeaderAccessControlAllowOrigin, ctx.HeaderParam(faygo.HeaderOrigin))

  ctx.SetHeader(faygo.HeaderAccessControlAllowMethods,"POST, GET, OPTIONS, PUT, DELETE")

  ctx.SetHeader(faygo.HeaderAccessControlAllowCredentials,"true")

  ctx.SetHeader(faygo.HeaderAccessControlAllowHeaders,

"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")

  ctx.SetHeader(faygo.HeaderAccessControlMaxAge,"172800")// 加上此参数,不用每次请求都发OPTIONS

  return nil

})

4、前端是用react,在fetchOptions中,需要添加

credentials:'include',

注意:mode: 'cors'  //这个参数不用。

建议:faygo修改下cross_origin.go,添加上面的内容。

另外,就是对每个api的路由定义,都要加上Use(tgMiddleware.CrossOrigin)和OPTIONS的处理,�faygo框架上能否提供更简化的办法?跨域(支持cookie)应该是最基本的功能,希望能整合进框架中。

你可能感兴趣的:(faygo框架的跨域(支持cookie)解决办法)