Skip to content

Commit db4ec74

Browse files
author
pzrr@qq.com
committed
#### Version 1.4.1
* dotweb新增ExcludeUse接口,用于设置指定排除路由的中间件 * 重构Middleware实现,优化dotweb结构,重构部分内部函数名称 * Node新增AppMiddlewares与GroupMiddlewares,用于存储App级、Group级的中间件实例 * Middleware新增Exclude相关接口 * Exclude(routers ...string)函数,用于指定不生效的路由 * HasExclude() bool函数,用于判定当前中间件实例是否存在排除路由 * ExistsExcludeRouter(router string) bool函数,用于判定当前中间件实例的排除路由中是否存在指定路由 * middleware执行优先级: - 优先级1:app级别middleware - 优先级2:group级别middleware - 优先级:router级别middleware * 更新example/middleware * 2018-01-01 23:00:00
1 parent 1dbd538 commit db4ec74

File tree

6 files changed

+59
-23
lines changed

6 files changed

+59
-23
lines changed

dotweb.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,11 @@ func (app *DotWeb) SetProductionMode() {
143143
// ExcludeUse registers a middleware exclude routers
144144
// like exclude /index or /query/:id
145145
func (app *DotWeb) ExcludeUse(m Middleware, routers ...string) {
146-
middlewareLen := len(app.Middlewares) - 1
146+
middlewareLen := len(app.Middlewares)
147147
if m != nil {
148148
m.Exclude(routers...)
149-
if middlewareLen >= 0 {
150-
app.Middlewares[middlewareLen].SetNext(m)
149+
if middlewareLen > 0 {
150+
app.Middlewares[middlewareLen-1].SetNext(m)
151151
}
152152
app.Middlewares = append(app.Middlewares, m)
153153
}
@@ -396,7 +396,11 @@ func (app *DotWeb) initBindMiddleware() {
396396
for path, node := range router.allNodeMap {
397397
logger.Logger().Debug("DotWeb initBindMiddleware "+path+" "+fmt.Sprint(node), LogTarget_HttpServer)
398398
node.appMiddlewares = app.Middlewares
399-
399+
for _, m := range node.appMiddlewares {
400+
if m.HasExclude() && m.ExistsExcludeRouter(node.fullPath) {
401+
node.hasExcludeMiddleware = true
402+
}
403+
}
400404
}
401405
}
402406

example/middleware/main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,8 @@ func main() {
3030
//app.UseRequestLog()
3131
app.Use(
3232
NewAccessFmtLog("app"),
33-
NewAccessFmtLog("app2"),
34-
//NewSimpleAuth("admin"),
3533
)
34+
app.ExcludeUse(NewAccessFmtLog("appex"), "/", "/")
3635

3736
//启动 监控服务
3837
app.SetPProfConfig(true, 8081)

middleware.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ type Middleware interface {
2525
SetNext(m Middleware)
2626
Next(ctx Context) error
2727
Exclude(routers ...string)
28+
HasExclude() bool
29+
ExistsExcludeRouter(router string) bool
2830
}
2931

3032
//middleware 基础类,应用可基于此实现完整Moddleware
@@ -60,6 +62,12 @@ func (bm *BaseMiddlware) Next(ctx Context) error {
6062
return httpCtx.Handler()(ctx)
6163
}
6264
} else {
65+
//check exclude config
66+
if ctx.RouterNode().Node().hasExcludeMiddleware && bm.next.HasExclude() {
67+
if bm.next.ExistsExcludeRouter(ctx.RouterNode().Node().fullPath) {
68+
return bm.next.Next(ctx)
69+
}
70+
}
6371
return bm.next.Handle(ctx)
6472
}
6573
return nil
@@ -71,10 +79,29 @@ func (bm *BaseMiddlware) Exclude(routers ...string) {
7179
bm.excludeRouters = make(map[string]struct{})
7280
}
7381
for _, v := range routers {
74-
if _, exists := bm.excludeRouters[v]; !exists {
75-
bm.excludeRouters[v] = struct{}{}
76-
}
82+
bm.excludeRouters[v] = struct{}{}
83+
}
84+
}
85+
86+
// HasExclude check has set exclude router
87+
func (bm *BaseMiddlware) HasExclude() bool {
88+
if bm.excludeRouters == nil {
89+
return false
90+
}
91+
if len(bm.excludeRouters) > 0 {
92+
return true
93+
} else {
94+
return false
95+
}
96+
}
97+
98+
// ExistsExcludeRouter check is exists router in exclude map
99+
func (bm *BaseMiddlware) ExistsExcludeRouter(router string) bool {
100+
if bm.excludeRouters == nil {
101+
return false
77102
}
103+
_, exists := bm.excludeRouters[router]
104+
return exists
78105
}
79106

80107
type xMiddleware struct {

router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ func (r *router) add(method, path string, handle RouterHandle, m ...Middleware)
491491
}
492492
//fmt.Println("Handle => ", method, " - ", *root, " - ", path)
493493
outnode = root.addRoute(path, handle, m...)
494+
outnode.fullPath = path
494495
r.allNodeMap[method+"_"+path] = outnode
495496
return
496497
}

tree.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,19 @@ const (
4141
)
4242

4343
type Node struct {
44-
path string
45-
wildChild bool
46-
nType nodeType
47-
maxParams uint8
48-
indices string
49-
children []*Node
50-
appMiddlewares []Middleware
51-
groupMiddlewares []Middleware
52-
middlewares []Middleware
53-
handle RouterHandle
54-
priority uint32
44+
path string
45+
fullPath string
46+
hasExcludeMiddleware bool
47+
wildChild bool
48+
nType nodeType
49+
maxParams uint8
50+
indices string
51+
children []*Node
52+
appMiddlewares []Middleware
53+
groupMiddlewares []Middleware
54+
middlewares []Middleware
55+
handle RouterHandle
56+
priority uint32
5557
}
5658

5759
//Use registers a middleware

version.MD

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
## dotweb版本记录:
22

33
#### Version 1.4.1
4-
* 优化dotweb结构,调整部分内部函数名称,增加initBindMiddleware
5-
* 重构Middleware实现
4+
* dotweb新增ExcludeUse接口,用于设置指定排除路由的中间件
5+
* 重构Middleware实现,优化dotweb结构,重构部分内部函数名称
66
* Node新增AppMiddlewares与GroupMiddlewares,用于存储App级、Group级的中间件实例
7-
* Middleware新增Exclude(routers ...string)函数,用于指定不生效的路由
7+
* Middleware新增Exclude相关接口
8+
* Exclude(routers ...string)函数,用于指定不生效的路由
9+
* HasExclude() bool函数,用于判定当前中间件实例是否存在排除路由
10+
* ExistsExcludeRouter(router string) bool函数,用于判定当前中间件实例的排除路由中是否存在指定路由
811
* middleware执行优先级:
912
- 优先级1:app级别middleware
1013
- 优先级2:group级别middleware

0 commit comments

Comments
 (0)