HTTP 状态 403 - 未找到预期的 CSRF 令牌
Posted
技术标签:
【中文标题】HTTP 状态 403 - 未找到预期的 CSRF 令牌【英文标题】:HTTP Status 403 - Expected CSRF token not found 【发布时间】:2015-10-21 18:57:15 【问题描述】:我正在从 angular $http 向服务器发帖,我得到了
HTTP Status 403 - Expected CSRF token not found.
我可以找到here 一种解决方案是禁用 CSRF,但我不确定这是我想要的。请告诉我如何解决这个问题。
我在前端使用 Angular JS,在服务器端使用 Spring MVC 4 和 Spring security 3.2。
编辑:
SecurityConfig.java
@Override
protected void configure(HttpSecurity http) throws Exception
http
.formLogin()
.loginPage("/signin")
.loginProcessingUrl("/signin/authenticate")
.failureUrl("/signin?param.error=bad_credentials")
.and()
.logout()
.logoutUrl("/signout")
.deleteCookies("JSESSIONID")
.and()
.authorizeRequests()
.antMatchers("search/**", "/c/**","/admin/**", "/favicon.ico", "/resources/**", "/auth/**", "/signin/**", "/signup/**", "/disconnect/facebook"/*, "/**"*/).permitAll()
.antMatchers("/**").authenticated()
.and()
.rememberMe()
.and()
.apply(
new SpringSocialConfigurer());
Angular JS ajax 请求:
$http(
method: 'POST',
url: 'addCampaign',
data: JSON.stringify(newCampaign)
).
success(function (data, status, headers, config)
//TODO Notification to show the campaign was successfully saved
$log.info("campaign successfully saved");
).error(function (data, status, headers, config)
$log.info("campaign could not be saved" + data + " " + status + " " + headers + " " + config);
//TODO to show notification that the campaign could not be saved succeffsully.
);
【问题讨论】:
您应该向我们展示您的 CRSF 的服务器端配置和客户端代码。 @RC。我已经编辑了答案以包含代码。 @codeMan 你找到解决方案了吗? @5er 是的,我找到了解决这个问题的方法。请看我的回答。 【参考方案1】:我找到了解决这个问题的方法。
我发现spring会将以下两个属性添加到我将返回的JSP视图中
`$_csrf.token` and `$_csrf.headerName`
我正在JSP
的meta
标签中收集这些属性
<meta name="_csrf" content="$_csrf.token" />
<meta name="_csrf_header" content="$_csrf.headerName" />
在javascript中,我写了以下函数,
function getMetaContentByName(name, content)
var content = (content == null) ? 'content' : content;
return document.querySelector("meta[name='" + name + "']").getAttribute(content);
在发送 ajax 请求时,我包含了存在的 CRFS 令牌-
$http(
method: 'POST',
headers:
'X-CSRF-TOKEN': getMetaContentByName('_csrf');
,
url: requestURL,
data: data
).
success(function (data, status, headers, config)
$log.info("data : " + data);
)
【讨论】:
以上是关于HTTP 状态 403 - 未找到预期的 CSRF 令牌的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS HTTP POST 未找到预期的 CSRF 令牌
HTTP 状态 403 - 在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”
HTTP 状态 403 - 在请求参数上发现无效的 CSRF 令牌“null”
在 Broadleaf 项目中 HTTP 状态 403 - 在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”