也加了如果有认证时的执行流程:

一个错误,

一个正确。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "log"
  6. "net/http"
  7. //"time"
  8. )
  9.  
  10. func middlewareFirst(next http.Handler) http.Handler {
  11. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  12. log.Println("MiddlewareFirst - Before Handler")
  13. next.ServeHTTP(w, r)
  14. log.Println("MiddlewareFirst - After Handler")
  15. })
  16. }
  17.  
  18. func middlewareSecond(next http.Handler) http.Handler {
  19. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  20. log.Println("MiddlewareSecond - Before Handler")
  21. if r.URL.Path == "/message" {
  22. if r.URL.Query().Get("password") == "password" {
  23. log.Println("Authorized to the system")
  24. next.ServeHTTP(w, r)
  25. } else {
  26. log.Println("Failed to authorize to the system")
  27. return
  28. }
  29. } else {
  30. next.ServeHTTP(w, r)
  31. }
  32. log.Println("MiddlewareSecond - After Handler")
  33. })
  34. }
  35.  
  36. func index(w http.ResponseWriter, r *http.Request) {
  37. log.Println("Executing index handler")
  38. fmt.Fprintf(w, "welcome!")
  39. }
  40.  
  41. func message(w http.ResponseWriter, r *http.Request) {
  42. log.Println("Executing message handler")
  43. fmt.Fprintf(w, "HTTP Middleware is awesome!")
  44. }
  45.  
  46. func iconHandler(w http.ResponseWriter, r *http.Request) {
  47.  
  48. }
  49.  
  50. func main() {
  51. http.HandleFunc("/favicon.ico", iconHandler)
  52. http.Handle("/", middlewareFirst(middlewareSecond(http.HandlerFunc(index))))
  53. http.Handle("/message", middlewareFirst(middlewareSecond(http.HandlerFunc(message))))
  54.  
  55. server := &http.Server{
  56. Addr: ":8080",
  57. }
  58. log.Println("Listening...")
  59. server.ListenAndServe()
  60.  
  61. }

  

《Web Development with Go》两个Middleware执行顺序的更多相关文章

  1. promise.then, setTimeout,await执行顺序问题

    promise.then VS setTimeout 在chrome和node环境环境中均输出2, 3, 1, 先输出2没什么好说的,3和1顺序让人有些意外 原因: 有一个事件循环,但是任务队列可以有 ...

  2. Reloading Java Classes 301: Classloaders in Web Development — Tomcat, GlassFish, OSGi, Tapestry 5 and so on Translation

    The Original link : http://zeroturnaround.com/rebellabs/rjc301/ Copyright reserved by Rebel Inc In t ...

  3. 【外文阅读】Web Development in 2020: What Coding Tools You Should Learn---Quincy Larson

    原文链接:https://mail.qq.com/cgi-bin/readtemplate?t=safety&check=false&gourl=https%3A%2F%2Fwww.f ...

  4. WEB API 系列(二) Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  5. WEB API Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  6. 《Agile Web Development With Rails》读后感--rails基于web设计的best Practices

    最近看完<Agile Web Development with Rails>一书,受益匪浅.书中先是用一个简单的web应用带你进入Rails的世界,然后在你大致熟悉之后,再带你了解Rail ...

  7. php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)

    php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...

  8. 详解Java Web项目启动执行顺序

    一. web.xml加载过程(步骤): 启动web项目,容器(如Tomcat.Apache)会去读取它的配置文件web.xml 中的两个节点,context-param和listener. 紧接着,容 ...

  9. Web API系列(二) Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

随机推荐

  1. Prometheus学习系列(一)之Prometheus简介

    前言 本文来自Prometheus官网手册 和 Prometheus简介 什么是prometheus? Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包.自2012 ...

  2. How to: Calculate a Property Value Based on Values from a Detail Collection 如何:基于详细信息集合中的值计算属性值

    This topic describes how to implement a business class, so that one of its properties is calculated ...

  3. Python 函数和类

    python作为一个面向对象的语言,也有类似java等面向对象语言相同的数据结构(class)的定义,和代码块数据结构定义"函数".为了极大可能的简化代码调用逻辑和书写规则,pyt ...

  4. bayaim_Centos7.6_mysql源码5.7-多my.cnf_20190424.txt

    用户名/密码mysql/mysql 一.安装mysql: 位置位于 /data/mysql 如果遇到依赖,无法删除,使用 rpm -e --nodeps <包的名字> 不检查依赖,直接删除 ...

  5. MATLAB实例:散点密度图

    MATLAB实例:散点密度图 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ MATLAB绘制用颜色表示数据密度的散点图 数据来源:MATLAB中“fit ...

  6. Iris入门操练1

    选一个框架,慢慢熟悉··· 按官网文档,先走一次.. package main import ( "github.com/kataras/iris/v12" "githu ...

  7. Java中dimension类详解

    Java中dimension类详解 https://blog.csdn.net/hrw1234567890/article/details/81217788

  8. Educational Codeforces Round 77 (Rated for Div. 2) D A game with traps

    题意:x正轴上有着一个陷阱的位置,开关和灵敏度,如果一个士兵灵敏度输给陷阱,他是过不去这个陷阱的幸运的是,你可以先过去把开关给关了,没错你是不怕陷阱的接下来呢你有操作,你移动一个,耗费一秒而你的团队需 ...

  9. 阿里云 centOS系统 配置 node + ngnix

    **centOS系统可以直接使用yun命令** 安装node 1.使用git将源码克隆到本地的~/.nvm目录下,并检查最新版本.> yum install git > git clone ...

  10. android屏幕监视工具 android screen monitor使用

    android screen monitor是一个非常好用的手机屏幕监视工具,可以将你的手机界面动态的显示出来,可用于项目演示. 这个工具就是其实一个jar文件,不到300KB大小,依赖jdk,并且还 ...