当前位置: 首页 > 面试题库 >

如何在net / http中注销处理程序?

闻人升
2023-03-14
问题内容

我正在编写一个Web服务器,其中需要在运行时注册处理程序。例如,“ / create”将为所有URL(例如“ / 123 /
”等)创建一个新的处理程序。我需要一个相应的“ / destroy / 123”,它将为“ / 123 / ”注销处理程序。

这是用于处理“ / create”的代码

package main
import (
    "fmt"
    "net/http"
)

type MyHandler struct {
    id int
}
func (hf *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, r.URL.Path)
}

// Creates MyHandler instances and registers them as handlers at runtime
type HandlerFactory struct {
    handler_id int
}
func (hf *HandlerFactory) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    hf.handler_id++
    handler := MyHandler{hf.handler_id}
    handle := fmt.Sprintf("/%d/", hf.handler_id)
    http.Handle(handle, &handler)
}

func main() {
    factory := HandlerFactory{0}
    http.Handle("/create", &factory)
    http.ListenAndServe("localhost:8080", nil)
}

我尝试通过嵌入来实现自己的多路复用器,http.ServeMux但它在私有变量(ServeMux.m)中保留了其模式到处理程序的映射


问题答案:

我要做的是创建一个自定义ServerMux。复制中的代码GOROOT/src/pkg/net/http/server.go。它始于837行,结束于939。

自定义ServerMux将需要一种注销方法。这应该易于实现。只需抓住锁和del()地图条目即可。例如(所有代码未经测试):

// TODO: check if registered and return error if not.
// TODO: possibly remove the automatic permanent link between /dir and /dir/.
func (mux *MyMux) Deregister(pattern string) error {
    mux.mu.Lock()
    defer mux.mu.Unlock()
    del(mux.m, pattern)
    return nil
}

为了使用这个新的多路复用器,您需要执行以下操作:

mux := newMux()
mux.Handle("/create", &factory)

srv := &http.Server {
    Addr: localhost:8080
    Handler: mux,
}
srv.ListenAndServe()

通过deregister()从另一个goroutine 调用来修改多路复用器是完全安全的,并且将修改ListenAndServe()路由消息的方式。



 类似资料:
  • 4.2.4注销处理 logout元素通过导航到特定URL添加了对注销的支持。默认的注销URL是/logout,但是您可以使用logout-url属性将其设置为其他内容。有关其他可用属性的更多信息可以在命名空间附录中找到。 但是,在遵循文档中的安全设置后,URL/logout不会显示注销页面。相反,它显示 Spring Framework 4.1.6 Spring Security 4.0.0 we

  • 在web.xml中,我有以下内容

  • 我正在使用Spring SAML实现。SSO circle元数据xml具有注销endpoint,这有助于本地注销和全局注销。但我正在与其他一些IDP进行交互,它们的元数据xml中没有注销endpoint。 在这些场景中应该如何处理LOGOUT? 删除请求的Cookie是这个问题的唯一解决方案吗?或者这个场景有什么解决方法吗? 非常感谢你在这方面的帮助。

  • 问题内容: 我正在开发命令行节点模块,希望能够通过网站上的链接启动它。 我想注册一个自定义协议,以使链接具有以下格式:单击它们将启动节点包。 如果没有为此的节点API(我确定不会),那么有什么办法可以通过调用系统命令从node做到这一点? 它必须在Windows,Linux和MacOS上运行。 问题答案: 这是一个有趣的想法。我认为目前没有跨平台的node.js解决方案。我确实遇到了要求同一件事的

  • 在很多问题上,处理器的速度比硬件交流要快得多。这种代价通常是小的 I/O,可能包括网络消耗,磁盘 I/O,数据库查询,文件 I/O,还有其他与处理器不太接近的硬件使用。所以构建一个快速的系统通常是一个提高 I/O,而非在紧凑的循环里优化代码或者甚至优化算法的问题。 有两种基本的技术来优化 I/O:缓存和代表(译者注:比如用短的字符代表长的字符)。缓存是通过本地存储数据的副本,再次获取数据时就不需要

  • 所以,我只是想处理用户从应用程序注销时的情况。当用户注销时,我调用方法,它按预期工作,即用户不再收到推送消息... 但是,如果没有internet连接方法,则deleteToken()没有帮助。尽管用户已注销,但在建立连接时仍会收到推送消息。 我该怎么处理这件事?