Golang登录接口POST请求返回400 Bad Request问题求助
问题根源与解决方案
你的问题核心是CSRF防护中间件拦截了请求,具体原因如下:
- 路由里启用了
NoSurf中间件,这个组件会强制校验所有POST请求的CSRF token合法性 - 你替换原渲染函数后,没有把原函数里的
AddCSRFData(pd, r)逻辑迁移到新的模板渲染流程中,导致模板上下文里没有CSRFToken值 - 同时你还把表单里的CSRF隐藏输入框给注释掉了,就算有token也传不到后端
这两个问题叠加,导致NoSurf直接返回400 Bad Request,请求根本没机会进入PostLoginHandler。
修复步骤
1. 恢复表单中的CSRF token输入框
取消HTML里的注释,把CSRF字段加回去:
<form method="post" action="/login"> <!-- 取消注释这行 --> <input type="hidden" name="csrf_token" value="{{.CSRFToken}}"> <h1 class="h3 mb-3 fw-normal">Please sign in</h1> <!-- 其余表单内容不变 --> </form>
2. 在新模板渲染逻辑中添加CSRF数据
在PostLoginHandler里渲染登录模板的地方,加上原渲染函数里的AddCSRFData调用,确保模板上下文包含CSRF token:
if !form.Valid() { // 先给PageData添加CSRF数据 pd := &models.PageData{Form: form} pd = AddCSRFData(pd, r) // 就是原RenderTemplate里的这行逻辑 err := m.App.UITemplates.ExecuteTemplate(w, "login.page.tmpl", pd) if err != nil { return } return }
3. 验证Session中间件配置
确保SetupSession中间件正确初始化了会话存储,因为NoSurf依赖Session来存储CSRF的会话密钥,如果Session配置有问题,也会导致token校验失败。
额外提示
如果后续其他页面也有POST表单,都要重复这两个步骤:
- 在表单里添加CSRF隐藏输入
- 渲染模板时通过
AddCSRFData把token注入模板上下文
内容的提问来源于stack exchange,提问作者Chris Williamson
相关产品推荐
相关产品推荐

