go - 使用 Golang、Revel 处理预检请求

标签 go cors preflight revel

我用Golang + Revel框架做了API应用

现在我尝试从由 vue.js 制作的前端应用程序发送 http 请求。

但是因为cors,无法处理PUT方法。(POST方法现在可以正常工作了)

在revel中,我认为我们可以在app/init.go文件中设置header,像这样

var HeaderFilter = func(c *revel.Controller, fc []revel.Filter) {
c.Response.Out.Header().Add("X-Frame-Options", "SAMEORIGIN")
c.Response.Out.Header().Add("X-XSS-Protection", "1; mode=block")
c.Response.Out.Header().Add("X-Content-Type-Options", "nosniff")
c.Response.Out.Header().Add("Referrer-Policy", "strict-origin-when-cross-origin")

// Add them by myself
c.Response.Out.Header().Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept")
c.Response.Out.Header().Add("Access-Control-Allow-Origin", "*")
c.Response.Out.Header().Add("Access-Control-Allow-Method", "POST, GET, OPTIONS, PUT, DELETE")
c.Response.Out.Header().Add("Content-Type", "application/json; charset=UTF-8")

fc[0](c, fc[1:]) // Execute the next filter stage.

但我仍然从 API 收到 404 错误,请求方法显示为 OPTIONS

如何设置请求 header 以启用处理每个请求?

最佳答案

在 revel.PanicFilter 之前添加一个过滤器

revel.Filters = []revel.Filter{
        ValidateOrigin,
        revel.PanicFilter,             // Recover from panics and display an error page instead.
        revel.RouterFilter,            // Use the routing table to select the right Action
        revel.FilterConfiguringFilter, // A hook for adding or removing per-Action filters.
        revel.ParamsFilter,            // Parse parameters into Controller.Params.
        IpLimitFilter,
        revel.SessionFilter,           // Restore and write the session cookie.
        revel.FlashFilter,             // Restore and write the flash cookie.
        revel.ValidationFilter,        // Restore kept validation errors and save new ones from cookie.
        revel.I18nFilter,              // Resolve the requested language
        HeaderFilter,
        revel.InterceptorFilter,       // Run interceptors around the action.
        revel.CompressFilter,          // Compress the result.
        revel.BeforeAfterFilter,       // Call the before and after filter functions
        revel.ActionInvoker,           // Invoke the action.
    }

var ValidateOrigin = func(c *revel.Controller, fc []revel.Filter) {
    if c.Request.Method == "OPTIONS" {
        c.Response.Out.Header().Add("Access-Control-Allow-Origin", "*")
        c.Response.Out.Header().Add("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization") //自定义 Header
        c.Response.Out.Header().Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
        c.Response.Out.Header().Add("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
        c.Response.Out.Header().Add("Access-Control-Allow-Credentials", "true")
        c.Response.SetStatus(http.StatusNoContent)
        // 截取复杂请求下post变成options请求后台处理方法(针对跨域请求检测)
    } else {
        c.Response.Out.Header().Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept")
        c.Response.Out.Header().Add("Access-Control-Allow-Origin", "*")
        c.Response.Out.Header().Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
        c.Response.Out.Header().Add("Content-Type", "application/json; charset=UTF-8")
        c.Response.Out.Header().Add("X-Frame-Options", "SAMORIGIN")
        c.Response.Out.Header().Add("Vary", "Origin, Access-Control-Request-Method, Access-Control-Request-Headers")

        fc[0](c, fc[1:]) // Execute the next filter stage.
    }
}
...

因为ajax把一个简单的request(单post)请求变成了二次请求,即先发送一个options请求判断domain是否允许,然后再发送真正的request post获取结果。

关于go - 使用 Golang、Revel 处理预检请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53164637/

相关文章:

javascript - 如何从pdf文件生成器中下载文件到Go和React中的本地客户端

heroku - Angular 2 : X-XSRF-TOKEN is not allowed by Access-Control-Allow-Headers

jquery - angularjs - 预检响应中的 Access-Control-Allow-Headers 不允许请求 header 字段

asp.net-web-api - Web API 中的 OWIN CORS 问题

templates - 如何在 hugo go 模板中使用 asciidocify 而不是 markdownify?

go - 如何避免 go.mod 文件中的间接依赖

go - 在 Go 中交换变量值的最佳方式?

node.js - CORS 问题,HapiJS HAPI-16

javascript - 使用 Django 和 Angular 的 CORS 预检请求

javascript - http|https NodeJS 模块将目标 url 更改为 http 导致重定向