beego跨域+后台Session控制

vue+beego做为后台跨域设置

在使用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"}
    vue跨域,复杂请求,后端为beego
    golang的跨域

跨域Session登录控制

Login函数

在前端要输入用户名和密码,在先后端未分离时采用前端

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

CheckLogin函数

同上,之前的方法是直接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中,再根据需求去处理。