转到Golang中间件内部的新页面

时间:2018-12-18 06:06:41

标签: go go-templates

假设我有一个按钮,它将打开一个新页面。该按钮的操作由对Golang API的AJAX调用处理。该Golang API由中间件Verify包装,该中间件将在定向到该页面之前验证所有内容。传递给中间件的函数中定义的页面正在使用Golang HTML模板。

router.GET("/newpage", Verify(newpageHandler))

func Verify(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {

        //verify everything here
        //if all verify, call newpageHandler to redirect to new page
        h.ServeHTTP(w,r)
    }
}

func newpageHandler(w http.ResponseWriter, r *http.Request) {
    //this handler will process the html template
}

当我单击按钮(对/newpage的AJAX调用)时,它不会打开新页面,而仅返回newpageHandler处理程序中的HTML内容。我可以看到浏览器开发人员工具返回的HTML,但没有在newpageHandler中定义新页面。

可以使用http.Redirect吗?

2 个答案:

答案 0 :(得分:1)

如果要更改页面,那么AJAX并不是您想要的。代替向API发送AJAX请求,您应该使用以下方法之一将浏览器重定向到该API:

HTML:

<a href="url/to/my/api">Go To page</a>

Javascript:

window.location = "url/to/my/api"

答案 1 :(得分:1)

AJAX调用将隐式地跟随重定向。 las,没有办法防止这种情况。因此,使用http.Redirect并不是一个好的选择。

您可以在“验证”功能中用信号表示是否接受了请求。使用http状态代码可以轻松完成此操作。如果一切正常,则可以返回2xx代码。如果出现错误,您可以返回4xx代码。

func Verify(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {

        //verify everything here. verifcationFunc() returns a bool
        if verifcationFunc() {
          w.WriteHeader(http.StatusOK)
        } else {
          w.WriteHeader(http.StatusUnauthorized)
        }
    }
}

您现在可以在JavaScript中评估返回的状态代码。在200上,您可以在JavaScript中设置新位置。可以使用window.location完成。在401代码上(在上面的示例中),您可以输出错误消息。