相关疑难解决方法(0)

编写Per-Handler中间件

我希望从我的处理程序中提取一些重复逻辑并将其放入一些每个处理程序中间件:特别是像CSRF检查,检查现有会话值(即用于身份验证或用于预览页面)等.

我已经阅读了一些关于此的文章,但是很多例子都集中在每个服务器的中间件(包装http.Handler)上:我有一小部分需要中间件的处理程序.我的大多数其他页面都没有,因此如果我可以避免检查会话/等.对于那些要求更好.

到目前为止,我的中间件通常看起来像这样:

func checkCSRF(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // get the session, check/validate/create the token based on HTTP method, etc.
        // return HTTP 403 on a failed check
        // else invoke the wrapped handler h(w, r)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在许多情况下,我想将变量传递给包装的处理程序:生成的CSRF令牌传递给模板,或者包含表单数据的结构 - 一个中间件检查会话是否存在某些已保存的表单数据用户点击一个/preview/URL,否则它会将它们重定向(因为它们没有任何内容可供预览!).

我想将该结构传递给包装的处理程序以节省必须复制session.Get/type断言/错误检查逻辑我刚刚在中间件中写道.

我可以这样写:

type CSRFHandlerFunc func(w http.ResponseWriter, r *http.Request, t string)
Run Code Online (Sandbox Code Playgroud)

...然后像这样编写中间件:

func csrfCheck(h CSRFHandlerFunc) http.HandlerFunc {
     return func(w http.ResponseWriter, r *http.Request) {
        // get the session, check/validate/create …
Run Code Online (Sandbox Code Playgroud)

middleware http go

4
推荐指数
1
解决办法
722
查看次数

标签 统计

go ×1

http ×1

middleware ×1