【发布时间】:2018-06-13 16:42:49
【问题描述】:
我已经为 CSRF 设置了 Spring Boot 1.5.x。在spring上测试一切正常:(1)服务器生成令牌并发送给客户端(2)如果客户端发送令牌一切正常。
使用 Web 客户端,我使用 Spring Boot 作为 rest API(使用 http://localhost:8088/)和 angularjs 作为客户端(使用 http://localhost:9000) 但它接缝问题出在 angularjs 上,它在标头密钥 XSRF-TOKEN 而不是 X-XSRF-TOKEN (spring 正在等待的那个)上发送令牌。
通过阅读 angularjs 文档,此标头密钥应自动发送 (https://docs.angularjs.org/api/ng/service/$http#cross-site-request-forgery-xsrf-protection)
angularjs 与 spring boot 交互的打印屏幕在哪里
(1) GET xhr 请求接收spring boot csrf token
在 spring 中,我使用 CORS 过滤器,并且只使用 spring 安全功能来生成 CSRF 令牌
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
在 angularjs 中,我已经尝试通过拦截器定义标题键(只是尝试解决方案)
$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';
var interceptor = ['$rootScope', '$q', 'httpBuffer', '$cookieStore', function ($rootScope, $q, httpBuffer, $cookieStore) {
return {
'request': function (config, a, b) {
return config;
},
'requestError': function (rejection) {
return $q.reject(rejection);
},
'response': function (response) {
$httpProvider.defaults.headers.common['X-XSRF-TOKEN'] = response.headers('XSRF-TOKEN');
return response;
},
'responseError': function (rejection) {
console.log('rejection', rejection.headers());
var deferred = $q.defer();
return $q.reject(rejection);
}
};
}];
$httpProvider.interceptors.push(interceptor);
【问题讨论】:
标签: angularjs spring-boot csrf