前言

golang web 通过http handle模块进行restful接口与请求处理绑定;既然用了restful每个公司或项目都会制定自己的设计原则和约束条件。在日常开发中通常会根据uri匹配规则在请求进入controller之前进行一些特殊处理(权限、功能验证...);在Java web编程中 servlet filter帮助我们实现了这样的功能,golang web通过扩展http handle即可实现

案例:

/safe /safe/user

假定: 以/safe开头的请求对客户端请求参数进行解密 以/safe/user开头的请求不仅要对客户端请求参数进行解密还要验证当前请求用户是否在线

实现思路:

定义FilterHandle、WebHandle类型

type FilterHandle func(rw http.ResponseWriter,r *http.Request) errortype WebHandle func(rw http.ResponseWriter,r *http.Request) error
复制代码

FilterHandle 拦截器处理函数 WebHandle 客户端请求处理函数

http handle模块与拦截器处理函数绑定 在拦截器处理函数中通过闭包回调WebHandle

注册拦截器处理函数 func Register(uriRule string,fh FilterHandle)

uri 路径匹配规则

★★★★★ 拦截器注册在http server 启动前

web filter代码示例:

/*** Created with IntelliJ IDEA.* Description: * User: yangzhao* Date: 2018-08-02* Time: 11:01*/
package web_filterimport ("net/http""strings"
)type FilterHandle func(rw http.ResponseWriter,r *http.Request) error//拦截uri映射处理
var filterMapping = make(map[string]FilterHandle,0)
//保证有序uri
var uriArray = make([]string,0)/**uriRule 路径匹配规则fh 拦截器处理函数*/
func Register(uriRule string,fh FilterHandle)  {uriRule = uriRule[:len(uriRule)-2]filterMapping[uriRule]=fhuriArray = append(uriArray,uriRule)
}type WebHandle func(rw http.ResponseWriter,r *http.Request) errorfunc Handle(webHandle WebHandle) func(rw http.ResponseWriter,r *http.Request) {return func(rw http.ResponseWriter,r *http.Request){var uri=r.RequestURIuri+="/"for _,v:=range uriArray{if strings.Contains(uri,v) {e := filterMapping[v](rw, r)if e != nil {rw.Write([]byte(e.Error()))return}}}err := webHandle(rw, r)if err != nil {rw.Write([]byte(err.Error()))}}
}复制代码

测试demo

/*** Created with IntelliJ IDEA.* Description: * User: yangzhao* Date: 2018-08-01* Time: 16:16*/
package testimport ("net/http""log""errors""testing""common-go/web/filter""fmt"
)type HttpServer struct {http.Server}func (server *HttpServer) StartServer()  {log.Println("web server start "+server.Addr)err := server.ListenAndServe()if err != nil {log.Panic(err)}
}func (server *HttpServer)ServeHTTP(wr http.ResponseWriter, r *http.Request)()  {fmt.Println("测试")
}func TestWebFilter(t *testing.T) {web_filter.Register("/safe/**", func(rw http.ResponseWriter, r *http.Request)error {return errors.New("解密失败")//return nil})web_filter.Register("/safe/user/**", func(rw http.ResponseWriter, r *http.Request)error {return errors.New("请登录")//return nil})http.HandleFunc("/safe", web_filter.Handle(func(wr http.ResponseWriter,req *http.Request) error{wr.Write([]byte(req.RequestURI))return nil}))http.HandleFunc("/safe/user/test", web_filter.Handle(func(wr http.ResponseWriter,req *http.Request) error{wr.Write([]byte(req.RequestURI))return nil}))http.HandleFunc("/safe/user", web_filter.Handle(func(wr http.ResponseWriter,req *http.Request) error{wr.Write([]byte(req.RequestURI))return nil}))server := &HttpServer{}server.Addr=":8080"server.StartServer()
}
复制代码

以上属于原创文章,转载请注明作者@怪咖

QQ:208275451

Golang web filter 轻量级实现相关推荐

  1. Golang Web入门(3):如何优雅的设计中间件

    Golang Web入门(3):如何优雅的设计中间件 摘要 我们上篇文章已经可以实现一个性能较高,且支持RESTful风格的路由了.但是,在Web应用的开发中,我们还需要一些可以被扩展的功能. 因此, ...

  2. golang web 服务器 request 与 response 处理

    golang web 服务器 request 与 response 处理 介绍常见 web 服务的实现与输入.输出数据处理.包括:静态文件服务.js 请求支持.模板输出.表单处理.Filter 中间件 ...

  3. Gin+Gorm+sessions 搭建 golang web项目

    Gin是用Go(Golang)编写的HTTP web框架.它具有类似Martini的API,但性能比Martini快40倍 Gorm,Golang 出色的ORM库 sessions,具有多后端支持的用 ...

  4. CentOS Docker安装配置部署Golang web helloworld

    目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker部署Golang web helloworld 四.Docker与虚拟机的区别 五. ...

  5. java web filter标签是什么,Java Web:5.Filter

    目录 什么是Filter? Filter是由Servlet容器进行调用,对 Servlet容器请求java服务端程序(调用资源:JSP,Servlet,静态HTML),java服务端程序响应Servl ...

  6. golang web开发框架 Beego

    1 介绍 Beego是一个开源的基于Golang的MVC框架,主要用于Golang Web开发.Beego可以用来快速开发API.Web.后端服务等各种应用. 个人开发 api类:gin 团队大项目: ...

  7. maven项目 报错 java.lang.ClassNotFoundException: org.springframework.web.filter.HiddenHttpMethodFilter

    报错信息如下: 严重: Exception starting filter hiddenHttpMethodFilter java.lang.ClassNotFoundException: org.s ...

  8. golang web php,golang 适合做web开发吗

    使用go语言来做web开发,是非常方便的.如果不使用框架,仅仅使用net/http包,也能快速开发一个web应用.但是,官方包不支持RESTful风格的API,所以我们依然还是需要选择一个框架来帮助我 ...

  9. java filter教程_Java Web Filter 过滤器学习教程(推荐)

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

最新文章

  1. apk私钥_apksigner  |  Android 开发者  |  Android Developers
  2. html css常用样式
  3. python getopts_linux bash shell 中getopts 命令 和 python 中 getopt 函数的比较总结
  4. C++堆排序(附完整源码)
  5. Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)...
  6. 在windows和linux下如何查看80端口占用情况?是被哪个进程占用?如何终止等
  7. poe交换机的作用和优点
  8. 设计模式-创建型模式-模板方法
  9. 聊聊基准测试的MVP方案
  10. USTC 1119 graph 图的同构
  11. C++单元测试工具CppUnit使用简介 【转载】
  12. 23种Python设计模式之工厂方法模式详解
  13. rzsz的编译安装及SecureCR下Zmodem传输用法
  14. 使用Tftpd64收集交换机日志
  15. Visual Studio 2012下载资源 百度云
  16. 单片机初始化WIFI模块
  17. 广西南宁机器人比赛_广西南宁中小学生机器人竞赛精彩纷呈
  18. axure怎么存html文件怎么打开,axure 保存html文件怎么打开
  19. 计算机四级-数据库工程师(数据库原理部分)
  20. win7怎样在线升级到win10 win7直接升级win10详细教程

热门文章

  1. Python3小程序:把连续的16进制UTF8编码转换为字符串
  2. GUI库:PyQt5
  3. python温度转换代码_用python编写一个名为“convert_temp”的温度转换函数
  4. vscode 崩溃_太真实了!程序员崩溃的40个瞬间
  5. 查询表授权给谁了_SQL Server 全局临时表竞争条件漏洞利用
  6. 计算机网络信号碰撞问题,计算机网络期末考试试题及问题详解29931(11页)-原创力文档...
  7. html 手机复制到剪贴板,移动端和pc端的复制到剪贴板功能
  8. 服务器网站链接ip限制,apache服务器对同一IP地址的连接限制
  9. Hibernate VS iBATIS
  10. 使用该JavaBean可以将数据在JSP页面中以表格的形式显示出来 并具有动态排序 动态生成查询 自动分页功能