我们正在构建一个Angular Material应用程序,使用一个RESTful Spring MVC API,使用Spring Security& OAuth2用户。
出于测试目的,我们为我们的/用户端点提供了ROLE_ANONYMOUS访问权限:
<intercept-url pattern="/users" method="POST" access="ROLE_ANONYMOUS"/>
但是当我们尝试通过POST发送JSON时,我们仍然从服务器获得401响应。
这是我们的app.config:
angular.module('App')
.constant('RESOURCES', (function () {
var resource = 'http://localhost:8080';
return {
USERS: resource + '/users'
}
})());
工厂在做POST方法:
app.factory('LoginUser', ['RESOURCES', '$resource', function (RESOURCES, $resource) {
return $resource(RESOURCES.USERS, null, {
add: {method: 'POST'}
});
}]);
控制器中的注册方法:
function signup(user) {
LoginUser.add({}, JSON.stringify(user));
}
我们在Spring guide之后的服务器中设置了SimpleCORSFilter。
您可以在此处查看邮递员POST和AngularJS POST之间的比较:
标记为红色的标题是我们必须在Postman中添加的自定义标题,以避免415不支持的媒体类型。
我们尝试在AngularJS的POST请求中放置自定义标头,但它似乎不起作用:
.config(function ($httpProvider) {
$httpProvider.defaults.headers.put['Content-Type'] = $httpProvider.defaults.headers.post['Content-Type'] =
'application/json; charset=UTF-8';
});
答案 0 :(得分:3)
好的,在查看截图后,我们注意到该方法是OPTIONS而不是POST。
问题不在标题中(我们检查的那些太多,以至于我们没有看到明显的),但是在飞行前请求OPTIONS由于CORS。这是一个nice article about it。我们的Spring Security是为POST方法配置的,但不是为OPTIONS配置的。我们改变了它,现在它就像一个魅力:
$sMotif = "/--$sIN ([a-zA-Z0-9]{3,4},)*([a-zA-Z0-9]{3,4}){1}/i";
if ((preg_match("$sMotif ",$this->sParam))||(eregi("$sMotif$",$this->sParam))){
$this->aParam['bExtension'] = TRUE;
$this->aParam['aExtension'] = $this->_PARAM_get_extension($sIN);
$this->aParam['inExtension'] = ($sIN=='e');
$this->aParam['iParameters']++;
}