Angular/Play应用中CSRF错误引发403的原因咨询
你的CSRF问题根源解析
这个问题的核心是Play框架的CSRF防护机制与Angular传递CSRF token的方式不匹配,具体拆解来看:
Play默认的CSRF校验逻辑限制
Play的CSRF过滤器对不同请求内容类型的校验规则不一样:- 对于表单类请求(比如
application/x-www-form-urlencoded、multipart/form-data),它会自动检查表单字段或者Cookie里的CSRF token; - 但对于
application/json类型的JSON请求,它默认不会去检查请求头里的token——而这恰恰是Angular传递CSRF token的常规方式。
- 对于表单类请求(比如
Angular与Play的token传递路径不兼容
Angular的HttpClient默认会自动从Cookie中读取XSRF-TOKEN,然后在请求头里带上X-XSRF-TOKEN字段来传递CSRF token。但Play默认没配置去识别这个请求头,所以当你的Angular客户端发送application/json类型的请求到/ws/users/add时,Play的CSRF过滤器找不到它预期的token,直接返回403拒绝请求,控制台的警告信息[CSRF] Check failed because application/json for request /ws/users/add也直接点明了是请求类型为application/json导致的校验失败。
另外还可能存在两个具体的细节问题:
- 客户端侧:如果你的请求是自定义封装的,可能没启用Angular自带的XSRF防护,导致没有自动带上
X-XSRF-TOKEN头; - 服务端侧:Play没有配置CSRF过滤器去读取请求头中的token,需要额外配置让它支持从
X-XSRF-TOKEN这类请求头获取token。
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

