登录
首页 >  Golang >  Go问答

Golang net/http 后端请求阻塞

来源:stackoverflow

时间:2024-02-20 11:42:21 483浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《Golang net/http 后端请求阻塞》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

有没有办法拒绝/阻止 go net/http“listenandserver”中的请求? 就我而言,我希望只允许带有 useragent“test 1.0”的请求。其他一切都将被阻止。

“我还想进行速率限制。例如:(如果来自同一 ip 的每秒请求在第二个块上持续 1 小时超过 50 r/s...)”我可以做到这一点,但正如我所说,我不知道如何阻止请求。

package main

import (
    "net/http"
)

func handle(w http.ResponseWriter, r *http.Request) {
    if r.UserAgent() == "test/1.0" {
        //Allow
    } else {
        //Block request
    }
}

func main() {
    http.HandleFunc("/", handle)
    http.ListenAndServe(":8080", nil)

}

正确答案


有几个选项。第一个是返回 error 响应:

func handle(w http.responsewriter, r *http.request) {
    if r.useragent() == "test/1.0" {
        //allow
    } else {
        http.error(w, "forbidden", http.statusforbidden)
        return
    }
}

第二种是向hijack发送来自服务器的连接并粗暴地关闭连接:

func handle(w http.ResponseWriter, r *http.Request) {
    if r.UserAgent() == "test/1.0" {
        //Allow
    } else {
        if h, ok := w.(http.Hijacker); ok {
            c, _, err := h.Hijack()
            if err != nil {
                c.Close()
                return
            }
        }
        // fallback to error response
        http.Error(w, "forbidden", http.StatusForbidden)
        return
    }
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>