Создание счетчика с куки - PullRequest
0 голосов
/ 04 апреля 2019

Я использовал приведенный ниже код для создания счетчика, используя куки. Но я думаю, что есть проблема с этой http.HandleFunc("/", foo) функцией. В идеале счетчик должен увеличиваться только тогда, когда запрос равен http:localhost:8080 или http:localhost:8080/.

Но count увеличивается, даже если после "/" (например: http:localhost:8080/abcd) я набираю какой-нибудь случайный текст.

func main() {
    http.HandleFunc("/", foo)
    http.Handle("/favicon.ico", http.NotFoundHandler())
    http.ListenAndServe(":8080", nil)
}

func foo(res http.ResponseWriter, req *http.Request) {
    cookie, err := req.Cookie("my-cookie-counter")

    if err == http.ErrNoCookie {
        cookie = &http.Cookie{
            Name:  "my-cookie-counter",
            Value: "0",
        }
    }
    count, err := strconv.Atoi(cookie.Value)
    if err != nil {
        log.Fatalln(err)
    }
    count++
    cookie.Value = strconv.Itoa(count)
    http.SetCookie(res, cookie)
    io.WriteString(res, cookie.Value)
}

Ответы [ 2 ]

4 голосов
/ 04 апреля 2019

Это задокументированное поведение пути / при обработке стандартной библиотекой ServeMux, как вы делаете.

Ваши варианты:

  1. Используйте другой маршрутизатор, который выполняет точное сопоставление.
  2. В вашем обработчике проверьте ожидаемый путь.
4 голосов
/ 04 апреля 2019
http.HandleFunc("/", foo)

Работает как префиксный сопоставитель.Это будет соответствовать root и все ниже.Один из способов сделать так, чтобы он совпадал только с корнем, это проверить r.URL.Path в вашем обработчике и не выполнять работу, если путь не является корнем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...