beego 前后端分离登录验证
conf>app.conf 文件添加一下参数
copyrequestbody=true
sessionon =true
routers>router.go 文件添加初始化路由
func init() {
///api/v1.0/areas
// beego.Router("/api/v1.0/areas", &controllers.AreaController{},"get:GetArea")
beego.Router("api/v1.0/areas", &controllers.LAreaControllers{}, "get:GetArea")
//TODO /api/v1.0/session
//TODO /api/v1.0/houses/index
beego.Router("/api/v1.0/session",&controllers.SessionController{},"get:GetSessionData;delete:DeleteSessionData")
beego.Router("/api/v1.0/sessions",&controllers.SessionController{},"post:Login")
beego.Router("/api/v1.0/houses/index",&controllers.HouseIndexController{},"get:GetHouseIndex")
beego.Router("/api/v1.0/users",&controllers.UserController{},"post:Reg")
}
models>recode.go 错误代码编码
package models const (
RECODE_OK = ""
RECODE_DBERR = ""
RECODE_NODATA = ""
RECODE_DATAEXIST = ""
RECODE_DATAERR = ""
RECODE_SESSIONERR = ""
RECODE_LOGINERR = ""
RECODE_PARAMERR = ""
RECODE_USERERR = ""
RECODE_ROLEERR = ""
RECODE_PWDERR = ""
RECODE_REQERR = ""
RECODE_IPERR = ""
RECODE_THIRDERR = ""
RECODE_IOERR = ""
RECODE_SERVERERR = ""
RECODE_UNKNOWERR = ""
) var recodeText = map[string]string{
RECODE_OK: "成功",
RECODE_DBERR: "数据库查询错误",
RECODE_NODATA: "无数据",
RECODE_DATAEXIST: "数据已存在",
RECODE_DATAERR: "数据错误",
RECODE_SESSIONERR: "用户未登录",
RECODE_LOGINERR: "用户登录失败",
RECODE_PARAMERR: "参数错误",
RECODE_USERERR: "用户不存在或未激活",
RECODE_ROLEERR: "用户身份错误",
RECODE_PWDERR: "密码错误",
RECODE_REQERR: "非法请求或请求次数受限",
RECODE_IPERR: "IP受限",
RECODE_THIRDERR: "第三方系统错误",
RECODE_IOERR: "文件读写错误",
RECODE_SERVERERR: "内部错误",
RECODE_UNKNOWERR: "未知错误",
} func RecodeText(code string)string {
str,ok := recodeText[code]
if ok {
return str
}
return RecodeText(RECODE_UNKNOWERR)
}
controllers>User.go 用户注册
package controllers import (
"encoding/json"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"lovehome/models"
) type UserController struct {
beego.Controller
} func (c *UserController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
func (c *UserController) Reg() { resp :=make(map[string]interface{})
defer c.RetData(resp) //TODO 获取前端传过来的json的数据
json.Unmarshal(c.Ctx.Input.RequestBody,&resp)
//beego.Info(resp)
//TODO 封装成结构体
o := orm.NewOrm()
user := models.User{}
user.Mobile = resp["mobile"].(string)
user.Name = resp["mobile"].(string)
user.Password_hash = resp["password"].(string)
id,err :=o.Insert(&user)
if err != nil{
resp["errno"]=models.RECODE_NODATA
resp["errmsg"]=models.RecodeText(models.RECODE_NODATA)
return
}
beego.Info("reg success,id=",id)
resp["errno"]=models.RECODE_OK
resp["errmsg"]=models.RecodeText(models.RECODE_OK)
c.SetSession("name",user.Name) } func (c *UserController) RetData(resp map[string]interface{}) {
c.Data["json"] =resp
c.ServeJSON()
}
controllers>Session.go 登录
package controllers import (
"encoding/json"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"lovehome/models"
) type SessionController struct {
beego.Controller
} func (c *SessionController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
//TODO 获取Session
func (c *SessionController) GetSessionData() {
beego.Info("connect success")
resp :=make(map[string]interface{})
defer c.RetData(resp)
user := models.User{}
//user.Name="浩秦" resp["errno"] =
resp["errmsg"] = "数据获取失败"
name := c.GetSession("name")
if name!=nil {
user.Name = name.(string)
resp["errno"] =
resp["mrrmsg"] = "ok"
resp["data"] = user
}
} //TODO 删除对应的Session
func (c *SessionController) DeleteSessionData() {
resp := make(map[string]interface{})
defer c.RetData(resp)
c.DelSession("name")
resp["errno"]=
resp["errmsg"]="ok"
}
// TODO 登录
func (c *SessionController) Login() { resp := make(map[string]interface{})
defer c.RetData(resp) //得到用户信息获取前端传递过来的json数据
json.Unmarshal(c.Ctx.Input.RequestBody,&resp)
beego.Info(&resp)
//判断是否合法
if resp["mobile"] == nil || resp["password"] ==nil{
resp["errno"]=models.RECODE_DATAERR
resp["errmsg"]=models.RecodeText(models.RECODE_DATAERR)
return
}
//与数据库匹配账号密码是否正确
o := orm.NewOrm()
user := models.User{Name:resp["mobile"].(string)}
moble := resp["mobile"].(string)
qs := o.QueryTable("user")
err := qs.Filter("mobile",moble).One(&user)
if err !=nil {
resp["errno"]=models.RECODE_DATAERR
resp["errmsg"]=models.RecodeText(models.RECODE_DATAERR)
beego.Info("2222name=",resp["mobile"],"========password====",resp["password"]) return
}
if user.Password_hash != resp["password"] {
resp["errno"]=models.RECODE_DATAERR
resp["errmsg"]=models.RecodeText(models.RECODE_DATAERR)
beego.Info("3333name=",resp["mobile"],"========password====",resp["password"])
return
}
//添加Session
c.SetSession("name",resp["mobile"])
c.SetSession("mobile",resp["mobile"])
c.SetSession("user_id",user.Id)
//返回json数据给前端
resp["errno"]=models.RECODE_OK
resp["errmsg"]=models.RecodeText(models.RECODE_OK) }
func (c *SessionController) RetData(resp map[string]interface{}) {
c.Data["json"] =resp
c.ServeJSON()
}
controllers>area.go
package controllers import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"lovehome/models"
) type LAreaControllers struct {
beego.Controller
} func (c *LAreaControllers) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
func (c *LAreaControllers) GetArea() {
beego.Info("connect success")
resp :=make(map[string]interface{})
resp["errno"]=
resp["errmsg"]="ok"
defer c.RetData(resp) //TODO 从MySQL里面读取数据
var areas []models.Area
o := orm.NewOrm()
num,err := o.QueryTable("area").All(&areas)
if err != nil {
resp["errno"]=
resp["errmsg"]="数据库查询失败"
return
}
if num == {
resp["errno"]=
resp["errmsg"]="没有查到数据"
}
//TODO 打包成json返回给前端
resp["data"]=areas
beego.Info("query data sucess,resp=",resp,"num=",num)
} func (c *LAreaControllers) RetData(resp map[string]interface{}) {
c.Data["json"] =resp
c.ServeJSON()
}
main.go beego前后端分离静态页面承载有点费劲,不过也好只是比gin多几句代码而已
package main import (
_ "lovehome/routers"
_ "lovehome/models"
"github.com/astaxie/beego" "github.com/astaxie/beego/context"
"net/http"
"strings"
) func main() {
ignoreStaticPath()
beego.Run()
} func ignoreStaticPath() {
beego.InsertFilter("/",beego.BeforeRouter,TransparentStatic)
beego.InsertFilter("/*",beego.BeforeRouter,TransparentStatic)
} func TransparentStatic(ctx *context.Context){
orpath := ctx.Request.URL.Path
beego.Info("request url:",orpath)
//如果请求url包含api字段,说明指令应该取消静态资源重定向
if strings.Index(orpath,"api") >= {
return
} http.ServeFile(ctx.ResponseWriter,ctx.Request,"static/html/"+ctx.Request.URL.Path) }
beego 前后端分离登录验证的更多相关文章
- 七:Spring Security 前后端分离登录,非法请求直接返回 JSON
Spring Security 前后端分离登录,非法请求直接返回 JSON 解决方案 在 Spring Security 中未获认证的请求默认会重定向到登录页,但是在前后端分离的登录中,这个默认行为则 ...
- Spring Security 前后端分离登录,非法请求直接返回 JSON
hello 各位小伙伴,国庆节终于过完啦,松哥也回来啦,今天开始咱们继续发干货! 关于 Spring Security,松哥之前发过多篇文章和大家聊聊这个安全框架的使用: 手把手带你入门 Spring ...
- nginx-springboot-vue前后端分离跨域配置
nginx-springboot-vue前后端分离跨域配置 引言 接着上篇--简单的springboot-vue前后端分离登录Session拦截的demo,其中跨域是通过springboot后端全局设 ...
- SpringBootSecurity学习(13)前后端分离版之JWT
JWT 使用 前面简单介绍了把默认的页面登录改为前后端分离的接口异步登录的方法,可以帮我们实现基本的前后端分离登录功能.但是这种基本的登录和前面的页面登录还有一个一样的地方,就是使用session和c ...
- SpringBoot20 集成SpringSecurity02 -> 利用SpringSecurity进行前后端分离的登录验证
1 SpirngBoot环境搭建 创建一个SpringBoot项目即可,详情参见三少的相关博文 参考博文 -> 点击前往 SpirngBoot项目脚手架 -> 点击前往 2 引入Spirn ...
- springboot 前后端分离开发 从零到整(三、登录以及登录状态的持续)
今天来写一下怎么登录和维持登录状态. 相信登录验证大家都比较熟悉,在Javaweb中一般保持登录状态都会用session.但如果是前后端分离的话,session的作用就没有那么明显了.对于前后端分离的 ...
- shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃
这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...
- Session与Token认证机制 前后端分离下如何登录
字号 1 Web登录涉及到知识点 1.1 HTTP无状态性 HTTP是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的 ...
- springboot-vue前后端分离session过期重新登录
springboot-vue前后端分离session过期重新登录 简单回顾cookie和session cookie和session都是回话管理的方式 Cookie cookie是浏览器端存储信息的一 ...
随机推荐
- Java中 单例模式(singleton)
Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收( ...
- java之struts2的ThreadLocal和ActionContext
在之前的学习中,我们知道struts2可以将表单中的数据自动设置到处理类的属性上,还有类型转换等其他功能.那么struts2是怎样做这件事情的呢? struts2完成这些功能是通过拦截器来完成的,并且 ...
- Linux环境下安装SVN
最近在研究svn的代码如何迁移到GitLab,因此借助本文,重新来回顾温习下svn的安装使用. 一.SVN的安装 svn的安装很简单,在互联网的环境,直接执行以下命令行即可. yum install ...
- C++之同名覆盖、多态
一.同名覆盖引发的问题 父子间的赋值兼容--子类对象可以当作父类对象使用(兼容性) 1.子类对象可以直接赋值给父类对象 2.子类对象可以直接初始化父类对象 3.父类指针可以指向子类对象 4.父类引用可 ...
- JavaScript HTML DOM元素节点常用操作接口
在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType :节点的类 ...
- go语言实现分布式id生成器
本文:https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-01-dist-id.html 分布式id生成器 有时我们需要能够生 ...
- mysql基础指令知识
桌面指令(cmd)进入mysql客户端 第一步:安装mysql,配置环境变量 第二步:手动开启服务 第三步:输入如下指令: mysql [-h localhost -P 3306] -u 用户名 - ...
- Java中重载(overloading)和重写(Overriding)的区别
一:方法的重载 (1)方法重载指在类中定义方法名相同,参数不同的不同的多个方法(返回值类型可随意,不能以返回类型作为重载函数的区分标准). 参数不同表现: 1.参数的个数不同 2.参数的类型不同 3. ...
- Linux正则表达式,grep总结,sed用法
原文: 1.sed 流编辑器,实现对文字的增删改替换查(过滤.取行),能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件 输入到屏幕,可以把只匹配到模式的内容输入到屏幕上.还可以对原文件 ...
- flask 扩展包
1.pipenv install python-dotenv (管理项目环境变量): 2.pipenv install watchdog --dev(监测文件变动,一般开发时使用): 3.pipen ...