middleware中check session

来源:3-17 api之http middleware的实现与handler收尾(上)

陈大洋

2019-03-23

func (m middleWareHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	//check session
	validateUserSession(r)

	m.r.ServeHTTP(w, r)
}

这个方法validateUserSession返回布尔值,我理解应该这样:

ok:=validateUserSession(r); if ok == true{
    m.r.ServeHTTP(w, r)
}else{
	sendErrorMsg()  // 返回401错误
}

请问老师我的想法合理吗?

写回答

1回答

艾文西

2019-03-24

是这样的

validateUserSession(r)

实际上做了两件事情,一个是返回session是否valid,一个是如果validate结果是true,则会把相应session的username带上去,那么在进入每一个handler的时候都会放行

具体放行的地方可以参考每一个handler的第一行,会判断如下

if !ValidateUser(w, r) {
		return
	}

而你说的返回401错误的部分已经在ValidateUser里面写过了。


其实这里是可以完全把validate的部分抽出来做成一个interface的,但是由于我们这个实战里面没有特别复杂的鉴权与参数校验等请求处理前的检查,因此没有这么做,只是简单的用了一个ValidateUser做了一下。

完整并且对大型项目来说,通用的部分应该用interface来抽象,并且在interface里面添加如下的步骤:

type RequestFlow interface {
    ValidateSession()
    ValidateUser()
    ValidateRequests()
    RequestHandler()
    ResponseBuilder()
    SendResponse()
}

然后用一个统一的通用流程将上述步骤串联起来,构成通用的request处理flow,这也是比较gopher的做法

1
1
陈大洋
非常感谢!
2019-03-24
共1条回复

Go语言实战流媒体视频网站,高效学习Go高性能开发

从零开始,全面掌握Go语言编码的架构风格和开发Web的关键技能

996 学习 · 268 问题

查看课程