gpt4 book ai didi

go http template 模板中的额外数据泄漏

转载 作者:IT王子 更新时间:2023-10-29 02:23:15 24 4
gpt4 key购买 nike

我正在使用 gin 创建一个简单的 crud webapp library.I 有一个路由设置,它检查参数 id 以及它的 add 是否应该呈现 admin-employee-add.html ,如果存在,则返回具有 id 的员工当我渲染模板时admin-employee-add.html 的错误消息 404 not found 被泄露到其中。这是快照 enter image description here

admin-employee-add.html

{{template "pageStart.html" .}}
<form class="form-horizontal admin-employee">
<div class="row form-group">
<label for="employeeNumber" class="col-lg-2 control-label text-right">Employee #</label>
<div class="col-lg-4">
<span>new</span>
</div>
<label for="status" class="col-lg-2 control-label text-right">Status</label>
<div class="col-lg-4">
<span>new</span>
</div>
</div>
<div class="row form-group">
<label for="firstName" class="col-lg-2 control-label text-right">Name</label>
<div class="col-lg-2">
<input type="text" id="firstName" name="firstName" class="form-control">
</div>
<div class="col-lg-2">
<input type="text" id="lastName" name="lastName" class="form-control">
</div>
</div>
<div class="row form-group">
<label for="startDate" class="col-lg-2 control-label text-right">Start Date</label>
<div class="col-lg-2">
<input type="date" id="startDate" name="startDate" class="form-control">
</div>
<label for="pto" class="control-label col-lg-2 col-lg-offset-2 text-right">PTO</label>
<div class="col-lg-3">
<input type="number" id="pto" name="pto" class="form-control">
</div>
<div class="col-lg-1">
days
</div>
</div>
<div class="row form-group">
<label for="position" class="col-lg-2 control-label text-right">Position</label>
<div class="col-lg-2">
<select name="position" id="position" class="form-control">
<option value="CEO">CEO</option>
<option value="CTO">CTO</option>
<option value="COO">COO</option>
<option value="WorkerBee">Worker Bee</option>
</select>
</div>
</div>
<div class="col-lg-3 col-lg-offset-8">
<button type="submit" class="btn btn-lg admin-primary">Create</button>
</div>
</form>

产生错误的路由

r.GET("/employee/:id/", func(c *gin.Context) {
id := c.Param("id")
if id == "add" {
c.HTML(http.StatusOK, "admin-employee-add.html", nil)
}

employee, ok := employees[id]

if !ok {
c.String(http.StatusNotFound, "404 not found", nil)
} else {
c.HTML(http.StatusOK, "admin-employee-edit.html", map[string]interface{}{
"Employee": employee,
})
}

})

错误似乎是因为 gin 试图重定向 /add -> /add/ 但我已经在使用 /add/ 在浏览器中路由。

gin的调试日志

[GIN-debug] GET    /login                    --> main.registerRoutes.func2 (3 handlers)
[GIN-debug] GET /employee/:id/ --> main.registerRoutes.func3 (3 handlers)
[GIN-debug] GET /employee/:id/vacation --> main.registerRoutes.func4 (3 handlers)
[GIN-debug] GET /admin/ --> main.registerRoutes.func5 (4 handlers)
[GIN-debug] Listening and serving HTTP on :3000
[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with
404
[GIN] 2016/05/01 - 14:12:13 | 404 | 1.101426ms | 127.0.0.1 | GET /employee/add/

我尝试将路由更改为 /:id 然后显示错误。

redirecting request 301: /employee/add/ --> /employee/add
[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with
404

注意:通过在 if id == "add" 末尾添加 return 可以轻松解决此错误。但是这种模式让代码看起来不那么枯燥。这似乎更像是一个 httprouter 问题。

最佳答案

如您所说,可以通过添加 return 轻松解决此错误。在 if id == "add" 的末尾.

c.Stringc.HTML使用相同的 Context c .在内部,它们写入同一个套接字(您可以将其视为文件指针)。因此,如果您调用 c.String然后 c.HTML反之亦然,它将按照调用的顺序附加输出。

查看您的代码,我假设您想在看到 /employee/add 时添加一名员工即呈现一个 html 页面来做到这一点。和 /employee/<something-other-than-add-as-id>它将获取并显示它 - 在本例中为 html 以编辑员工信息。

if id == "add" 之后添加return 是有意义的因为为这两种情况生成的 html 是不同的(它们使用不同的模板)。纯粹为 /employee/add/ 添加单独的处理程序也是另一种选择。

关于go http template 模板中的额外数据泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com