在使用golang作web的应用程序的时候,最容易碰到跨域问题了,跨域就是www.a.com访问www.b.com的文件。可是在浏览器里,为了安全起见,这样作是不容许的,这就是js的同源策略了。
鉴于此,vue
前端须要传输数据到后端时,就遇到了跨域的问题,为了解决跨域问题,beego
框架提供了如下的解决方法html
// 这段代码放在router.go文件的init()的开头
beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
AllowAllOrigins: true,
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
AllowCredentials: true,
}))
InsertFilter
函数的做用是提供一个过滤函数,其解释为InsertFilter adds a FilterFunc with pattern condition and action constant.
AllowAllOrigins: true
容许访问全部源AllowMethods:[]string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}
指容许使用大括号中的方法访问,其中Options用于跨域复杂请求预检AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"}
指的是容许的Header
的种类,若是为空则beego
会使用默认值defaultAllowHeaders = []string{"Origin", "Accept", "Content-Type", "Authorization"}
在前端要输入用户名和密码,在先后端未分离时采用前端
UserName := this.GetString("UserName")
Password := this.GetString("Password")
可是这种方法如今已经再也不适用,由于前端传输过来的数据格式死json
,所以须要解析vue
type Login struct {
UserName string
Password string
}
var login Login
json.Unmarshal(this.Ctx.Input.RequestBody, &login)
username := login.UserName
password := login.Password
具体缘由参考以前的文章golang的JSON处理,只有这样处理以后才能正确获得用户输入的用户名和密码,从而判断其登录合法与否,合法则正常SetSession
,不合法则返回错误信息。golang
同上,之前的方法是直接GetSession("session")
,可是分离以后这种方法已经再也不适用,而须要改成web
type Session struct {
Session int
}
var sess Session
json.Unmarshal(this.Ctx.Input.RequestBody, &sess)
isLogin := sess.Session
if isLogin <= 0 {
flash.Error("session验证失败,请重试")
flash.Store(&this.Controller)
this.JsonReturn()
return
}
.....
RequestBody
,通常为json
数据,在golang
中能够解析到interface
或是struct
中,再根据需求去处理。