1. package main
  2.  
  3. //中间件1:只允许特定host请求过来
  4. import (
  5. "fmt"
  6. "net/http"
  7. )
  8.  
  9. //SingleHost是一个中间件,
  10. type SingleHost struct {
  11. hander http.Handler //这不是继承http.Handler接口,后面重写了ServeHTTP方法。
  12. /*
  13. type Handler interface {
  14. ServeHTTP(ResponseWriter, *Request)
  15. }*/
  16. allowedHost string //只准允许某个host发来的请求
  17. }
  18.  
  19. //Handler这个接口只有一个方法,SingleHost实现了这个方法就相当于继承了Handler interface接口
  20. //请求来的时候会来这里
  21. func (this *SingleHost) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  22.  
  23. fmt.Println(r.Host)
  24.  
  25. if r.Host == this.allowedHost { //从Request里面可以获取Host
  26. this.hander.ServeHTTP(w, r)
  27. } else {
  28. w.WriteHeader(403)
  29. }
  30. }
  31.  
  32. func myHandler(w http.ResponseWriter, r *http.Request) {
  33. w.Write([]byte("helloworld"))
  34. }
  35.  
  36. func main() {
  37. sing := &SingleHost{
  38. hander: http.HandlerFunc(myHandler),
  39. allowedHost: "example.com", //只有example.com过来的才合法
  40. }
  41. http.ListenAndServe(":8080", sing)
  42. }

中间件形式2:函数形式

  1. package main
  2.  
  3. //中间件2:只允许特定host请求过来。
  4. //函数的形式。
  5. import (
  6. "fmt"
  7. "net/http"
  8. )
  9.  
  10. /*
  11. type HandlerFunc func(ResponseWriter, *Request)
  12.  
  13. // ServeHTTP calls f(w, r).
  14. func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
  15. f(w, r)
  16. }
  17. */
  18.  
  19. func SingleHost(handler http.Handler, allowstring string) http.Handler {
  20. fn := func(w http.ResponseWriter, r *http.Request) {
  21. if r.Host == allowstring { //从Request里面可以获取Host
  22. this.hander.ServeHTTP(w, r)
  23. } else {
  24. w.WriteHeader(403)
  25. }
  26. }
  27. return http.HandlerFunc(fn)
  28. }
  29.  
  30. func myHandler(w http.ResponseWriter, r *http.Request) {
  31. w.Write([]byte("helloworld"))
  32. }
  33.  
  34. func main() {
  35. sing := SingleHost(http.HandlerFunc(myHandler), "example.com")
  36. http.ListenAndServe(":8080", sing)
  37. }
  1. package main
  2.  
  3. //中间件3:只允许特定host请求过来。
  4. //追加内容形式。
  5. import (
  6. _ "fmt"
  7. "net/http"
  8. )
  9.  
  10. type AppendMiddleware struct {
  11. handler http.Handler
  12. }
  13.  
  14. func (this *AppendMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  15. this.handler.ServeHTTP(w, r) //正常是响应
  16. w.Write([]byte("Hey,this is middleware")) //多输出一行内容,告诉用户这是中间价
  17. }
  18.  
  19. func myHandler(w http.ResponseWriter, r *http.Request) {
  20. w.Write([]byte("helloworld"))
  21. }
  22.  
  23. func main() {
  24. mid := &AppendMiddleware{http.HandlerFunc(myHandler)}
  25. http.ListenAndServe(":8080", mid)
  26. }
  1. package main
  2.  
  3. //中间件3:只允许特定host请求过来。
  4. //自定义响应。
  5. import (
  6. _ "fmt"
  7. "net/http"
  8. "net/http/httpest"
  9. )
  10.  
  11. //先将所有的响应保存起来,完成所有操作之后,然后一起输出
  12.  
  13. type ModifiedMiddleware struct {
  14. handler http.Handler
  15. }
  16.  
  17. func (this *ModifiedMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  18. rec := httptest.NewRecorder()
  19. this.handler.ServeHTTP(rec, r) //rec将所有的响应记录下来
  20. for k, v := range rec.Header() {
  21. w.Header()[k] = v
  22. }
  23. w.Header().Set("go-web-foundation", "vip")
  24. w.WriteHeader(418)
  25. w.Write([]byte("this is middleware"))
  26. w.Write(rec.Body.Bytes())
  27. }
  28.  
  29. func myHandler(w http.ResponseWriter, r *http.Request) {
  30. w.Write([]byte("helloworld"))
  31. }
  32.  
  33. func main() {
  34. mid := &ModifiedMiddleware{http.HandlerFunc(myHandler)}
  35. http.ListenAndServe(":8080", mid)
  36. }

boogo08---中间件的更多相关文章

  1. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  2. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

  3. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...

  4. ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...

  5. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  8. 从中间件的历史来看移动App开发的未来

    在移动开发领域我们发现一个很奇怪的现象:普通菜鸟新手经过3个月的培训就可以拿到 8K 甚至上万的工作:在北京稍微有点工作经验的 iOS 开发,就要求 2 万一个月的工资.不知道大家是否想过:移动应用开 ...

  9. ASP.NET Core的路由[4]:来认识一下实现路由的RouterMiddleware中间件

    虽然ASP.NET Core应用的路由是通过RouterMiddleware这个中间件来完成的,但是具体的路由解析功能都落在指定的Router对象上,不过我们依然有必要以代码实现的角度来介绍一下这个中 ...

  10. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

    DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...

随机推荐

  1. [BZOJ1584] [Usaco2009 Mar]Cleaning Up 打扫卫生(DP)

    传送门 不会啊,看了好久的题解才看懂 TT 因为可以直接分成n段,所以就得到一个答案n,求解最小的答案,肯定是 <= n 的, 所以每一段中的不同数的个数都必须 <= sqrt(n),不然 ...

  2. [BZOJ1583] [Usaco2009 Mar]Moon Mooing 哞哞叫(队列)

    传送门 思想有点像蚯蚓那个题 #include <cstdio> #define N 4000001 #define LL long long #define min(x, y) ((x) ...

  3. 【基础操作】FFT / DWT / NTT / FWT 详解

    1. 2. 点值表示法 假设两个多项式相乘后得到的多项式 的次数(最高次项的幂数)为 $n$.(这个很好求,两个多项式的最高次项的幂数相加就得到了) 对于每个点,要用 $O(n)$ 的时间 把 $x$ ...

  4. 洛谷 [P1290] 欧几里得的游戏

    SG函数的应用 看到这题就想到了SG函数 那么可以考虑最终情况:一个数是x,另一个是0,那么先手必败(因为上一个人已经得到0了,其实游戏已经结束了) 剩下的情况:一个数n, 一个数m,假设n>m ...

  5. NGUI中以添加摄像机的方式实现SCROLL LIST

    1.添加多一个UI ROOT对象 2.把CAMERAER对象移至ROOT对象成为其直接子对象, 3.为CAMERAER对象添加UIVIEWPORT组件,并把其SOURCE CAMERA设置为主相机,设 ...

  6. golang导出Excel表格

    设置样式: package main import ( "github.com/tealeg/xlsx" "fmt" ) func main() { var f ...

  7. 因chmod /usr致使raspberryPi重装

    一.系统安装noobs 设置用户名及密码,设置超级用户root密码:  sudo passwd root,回车后按提示输入两次root的密码(注意,输入时是不会提示*号的,直接输入即可) 二.源及软件 ...

  8. 用systemtap跟踪打印动态链接库的所有c++函数调用过程

    http://gmd20.blog.163.com/blog/static/168439232015475525227/             用systemtap跟踪打印动态链接库的所有c++函数 ...

  9. Liunx常用命令(备用)

    常用指令 ls        显示文件或目录 -l           列出文件详细信息l(list) -a          列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir     ...

  10. jmeter自定义并发用户数图形插件介绍

    Stepping Thread Group马上要被废弃了,废弃原因不知道,官方推荐使用 BlazeMeter Inc.公司贡献的插件Concurrency Thread Group,配合 Throug ...