摘要:本节主要是控制层的配置文件(获取参数、常用的参数设置、引入配置文件)、路由详解(固定路由、正则路由、自动路由、自定义路由、路由过滤器)、表单数据检验(限制符使用、限制条件自定义)

一、【controller】配置文件

在Beego框架中,项目的配置文件一般都写在conf文件目录下。

① 获取配置文件中的参数

// confController.go
httpport, _ := beego.AppConfig.Int("httpport")
name := beego.AppConfig.String()

c.Data["httpport"] = httpport
c.Data["name"] = name
// config.html
app.conf<br>
name: {{.name}}
httpport:{{.httpport}}

② 在conf文件中引入其他配置文件

// app.conf
inclube "mysql.conf"

// mysql.conf
username = "root"
password = 123456
port = 3306
//confController.go
username := beego.AppConfig.String("username")
password, _ := beego.AppConfig.Int("password")
prot, _ := beego.AppConfig.Int("port")

c.Data["username"] = username
c.Data["password"] = password
c.Data["prot"] = prot
mysql.conf<br>
username: {{.username}}
password: {{.password}}
port: {{.port}}

③ 常用的配置

  1. ViewsPath:模板路径,默认值是 views;

2. StaticDir:静态文件目录设置,默认是static;

3. sessionon:session 是否开启,默认是 false;

4. httpport:监听端口;

// 例如:
ViewsPath = "xxx/xxx/xxx"
StaticDir = "xxx/xxx/xxx"
sessionon = true
httpport = 8080

5. EnableXSRF:EnableXSRF;

6. XSRFExpire:XSRF 过期时间,默认值是 0,不过期;

7. MaxMemory:文件上传默认内存缓存大小,默认值是1 << 26(64M);

8. RunMode:应用的运行模式,可选值为prod,dev或者test. 默认是dev, 为开发模式。

二、【Router】路由详解

1、固定路由

一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器中对应的方法

beego.Router("/hello", &controllers_user.Hello{})

2、正则路由

beego.Router(“/api/?:id”, &controllers.UserController{})
beego.Router("/user/?:id:int", &controllers.UserController{})

//常见的路由正则表达式
:id([0-9]+) 或者 :id([\d]+) 或者 :id:int    //路由需要输入int类型
:username([\w]+) 或者 :username:string      //路由需要输入字符串

3、自动路由

注册路由的时候不需要指定url,只需要注册控制器即可

beego.AutoRouter(&controllers.UserController{})

规则:
    /控制器名/方法名/后面的都是参数。。。
    如:/user/get/123/456

4、自定义路由

注册路由的时候可以指定第三个参数,这个参数就是用来自定义路由的

用法: method :函数名

//RouterController.go
type RouterController struct{
    beego.Controller
}

func (r *RouterController) List(){
    r.TplName = "chapter03/list.html"
}

//router.go
beego.Router("/list",&chapter03.RouterController{},"get:List")

post:Login  ( post请求的时候访问Login函数)
get:User       ( get请求的时候访问User函数)
*:LoginOut  (所有的请求方法都访问LoginOut函数)

三、过滤器

先将过滤器打开

//app.conf
sessionon = true

设置路由

//router.go
//测试过滤器用的url
beego.Router("login",&chapter04.LoginController{})

//需要登入才可以进入,为方便测试我们直接将信息传递到浏览器上
beego.Router("/test/user",&controllers.MainController{})
beego.Router("/test/login",&controllers.MainController{})
beego.Router("/test/index",&controllers.MainController{})

//LoginController.go
type LoginController struct{
    beego.Controller
}

func (l *LoginController) Get(){
    l.SetSession("username")
    l.Ctx.WriterString("登录页面,设置session成功")
}
//myFilter.go
func MyFilter(ctx *context.Context){
    username := ctx.Input.Session("username")
    if username == nil {
        ctx.WriterString("没有登录,请前往登录页面")
    }
}
//main.go
beego.InsertFilter("/test/*",beego.BeforeRouter,chapter04.MyFilter)
  1. 第一个参数表示过滤的路由规则,支持通配符
  2. 第二个参数表示过滤器的位置,beego支持的有5种
  • BeforeStatic 静态地址之前
  • BeforeRouter 寻找路由之前
  • BeforeExec 找到路由之后,开始执行相应的 Controller 之前
  • AfterExec 执行完 Controller 逻辑之后执行的过滤器
  • FinishRouter 执行完逻辑之后执行的过滤器
  1. 第三个参数为执行的函数
  2. func(*context.Context) 参数必须是context.Context , 使用的context包是beego包下的("github.com/astaxie/beego/context")
  3. 其他参数:使用默认得到true即可
  4. 注意:使用 session 的 Filter 必须在 BeforeStatic 之后才能获取,因为 session 没有在这之前初始化。

完成代码后我们开始就行测试

① 输入 "/test/login/" 进行测试时因为 username 对应的 key 是空值所以不符合过滤器的要求

② 进入 "/login" 后,过滤器获得了值 "nina"。

③ 再次输入 "/test/login/" ,因为此时符合过滤器的要求所以可以访问路由中设定的页面

四、session和cookie

1、什么是session?

  • Session是在无状态的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制
  • 它是在服务端保存的用来跟踪用户的状态的数据结构,可以保存在文件、数据库或者集群中
  • 在浏览器关闭后这次的Session就消失了,下次打开就不再拥有这个Session。其实并不是Session消失了,而是Session ID变了。

2、什么是cookie?

  • Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息
  • 每次HTTP请求时,客户端都会发送相应的Cookie信息到服务端。它的过期时间可以任意设置,如果你不主动清除它,在很长一段时间里面都可以保留着,即便这之间你把电脑关机了。
  • 每次客户端发请求的时候会自动携带该域名下的Cookie,不用域名间的Cookie是不能共享的

3、session和cookie:

  • Cookie 在客户端(浏览器),Session 在服务器端。
  • Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie就好了。
  • 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
  • Session 可以放在 文件、数据库或内存中
  • 用户验证这种场合一般会用 Session。因此,维持一个会话的核心就是客户端的唯一标识,即Session ID。
  • Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)

4、beego中使用session:

//开启session
//main.go
beego.BConfig.WebConfig.Session.SessionOn = true

//配置文件中开启:
sessionon = true
//使用session
//insterFile.go

func (l *LoginController) Get() {
    //设置session
	l.SetSession("username","nina")
	l.Ctx.WriteString("设置session成功")
    
    //查询session
	fmt.Println("--------------查询session")
	user := l.GetSession("username")
	fmt.Println(user)
    
    //删除session
	fmt.Println("--------------删除session")
	l.DelSession("username")
	user1 := l.GetSession("username")
	fmt.Println(user1)
}

//在过滤器中获取session
//my_Filter.go
func MyFilter(ctx *context.Context)  {

	username := ctx.Input.Session("username")
	if username == nil {
		ctx.WriteString("没有登入")
	}
}

关于session的一些其他配置

① 设置是否开启 Session,默认为false

beego.BConfig.WebConfig.Session.SessionOn

② 设置 Session 过期的时间,默认值是 3600 秒

beego.BConfig.WebConfig.Session.SessionGCMaxLifetime

③ 设置 cookie 的过期时间

beego.BConfig.WebConfig.Session.SessionCookieLifeTime

④ 设置sessionid加密算法,默认值为 sha1

beego.BConfig.WebConfig.Session.SessionHashFunc

⑤ 修改sessionkey,默认的 key 是 beegoserversessionkey,建议在使用的时候修改该参数

beego.BConfig.WebConfig.Session.SessionHashKey

⑥ 设置 cookies 的名字,Session 默认是保存在用户的浏览器 cookies 里面的,默认名是 beegosessionID,配置文件对应的参数名是:sessionname。

beego.BConfig.WebConfig.Session.SessionName

五、表单数据校验

在beego框架中使用的表单验证工具是validation,首先我们需要下载validation。

go get github.com/astaxie/beego/validation
go mod vendor
//test_valid.html

<form action ="valid" method="post">
    用户名:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    <input type="sumbit" value="提交">
</form>
//router.go
beego.Router("/valid",&chapter04.ValidController{})

在/validation/validators.go中有我们可以使用的默认限制

//test_valid.go
type ValidController struct{
    beego.Controller
}

type User struct{
    Id int `form:"_"`
    Name string `form:"username" valid:"Required;MinSize(2)"`
    Passwd string `form:"password" valid:"Required"`
}

func (v *ValidController) Post(){
    var user User
    v.ParseForm(&user)
    fmt.Println("----------------------")
    fmt.Println(user)
    
    //初始化了一个valid结构体

    valid := validation.Validation{}
 
    b,err := valid.Valid(&user)
    //检查限制条件是否出错
    if err != nil{
        v.Ctx.WriteString("tag出现问题")
    }
    //检查接收的数据是否满足限制条件
    if !b {
        for _,err := ranger valid.Errors{
            fmt.Println(err.Key,err.Message)
            message := err.Key + err.Message
            v.Ctx.WriteString(message)
        }
    } else {
        v.Ctx.WriteString("提交成功")
    }
}

func (v *ValidController) Get(){
    v.TplName = "chapter04/test_valid.html"
}

开始做测试。

① 用户名小于2个字符

② 密码栏为空

除了使用默认的限制条件,我们还可以对限制条件进行简单的修改

message := map[string]string{
    "Required": "不能为空",
    "MinSize":  "最短长度为 %d",
    "Length":   "长度必须为 %d",
    "Numeric":  "必须是有效的数字",
    "Email":    "必须是有效的电子邮件地址",
    "Mobile":   "必须是有效的手机号码",
}

validation.SetDefaultMessage(message)