Java spring boot js http:/localhost:8080/logout 403禁止的错误
我无法解决这个问题 我尝试创建一个提示登录注销示例。登录工作正常,但当我尝试注销时,浏览器显示NetworkError:403禁止本地主机:8080/禁止注销 在我看来,我应该在ui端的每个请求中添加令牌头。但我不知道如何才能做到这一点 以下是浏览器开发人员工具消息: 403后 {“timestamp”:1501570024381,“status”:403,“error”:“probled”,“message”:“无效的CSRF令牌'null'被删除” 在请求参数“\u csrf”或标题“X-csrf-TOKEN.”,“路径”中找到“/helpdesk/logout”} 以下是我的角度注销功能:Java spring boot js http:/localhost:8080/logout 403禁止的错误,java,angularjs,spring-boot,spring-security,Java,Angularjs,Spring Boot,Spring Security,我无法解决这个问题 我尝试创建一个提示登录注销示例。登录工作正常,但当我尝试注销时,浏览器显示NetworkError:403禁止本地主机:8080/禁止注销 在我看来,我应该在ui端的每个请求中添加令牌头。但我不知道如何才能做到这一点 以下是浏览器开发人员工具消息: 403后 {“timestamp”:1501570024381,“status”:403,“error”:“probled”,“message”:“无效的CSRF令牌'null'被删除” 在请求参数“\u csrf”或标题“X-c
$scope.logout = function() {
$http.post('logout',{}).success(function() {
$rootScope.authenticated = false;
$location.path("/home");
}).error(function(data) {
$rootScope.authenticated = false;
});
}
以下是我的SpringSecurityConfig配置方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().and()
.authorizeRequests()
.antMatchers("/index.html","/pages/**","/","/webjars/**")
.permitAll()
.anyRequest()
.authenticated().and().logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout")).permitAll()
.logoutSuccessHandler(logoutSuccess)
.deleteCookies("JSESSIONID").invalidateHttpSession(false)
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
我怎样才能解决这个问题?如何将令牌头添加到所有请求?您能帮我吗?
CSRF
令牌将由SpringSec检查所有post
请求。因此,您可以每次包含它,也可以禁用它。XML配置如下所示:
<http ...... >
<!-- ... -->
<csrf disabled="true"/>
</http>
这样,您就不需要关心它的包含。要正确处理CSRF令牌
请查看
另外,如果没有帮助,请告诉我,或者至少为您指出正确的方向。我解决了我的问题:
首先,我在研究谷歌时发现
之后,我在我的应用程序中应用了相同的拦截器,如下所示:
app.factory('CsrfTokenInterceptorService', ['$q',
function CsrfTokenInterceptorService($q) {
// Private constants.
var CSRF_TOKEN_HEADER = 'X-CSRF-TOKEN',
HTTP_TYPES_TO_ADD_TOKEN = ['DELETE', 'POST', 'PUT'];
// Private properties.
var token;
// Public interface.
var service = {
response: onSuccess,
responseError: onFailure,
request: onRequest,
};
return service;
// Private functions.
function onFailure(response) {
if (response.status === 403) {
console.log('Request forbidden. Ensure CSRF token is sent for non-idempotent requests.');
}
return $q.reject(response);
}
function onRequest(config) {
if (HTTP_TYPES_TO_ADD_TOKEN.indexOf(config.method.toUpperCase()) !== -1) {
config.headers[CSRF_TOKEN_HEADER] = token;
}
return config;
}
function onSuccess(response) {
var newToken = response.headers(CSRF_TOKEN_HEADER);
if (newToken) {
token = newToken;
}
return response;
}
}]);
并将以下内容添加到app.config方法:
$httpProvider.defaults.xsrfHeaderName = 'X-CSRF-TOKEN';
$httpProvider.interceptors.push('CsrfTokenInterceptorService');
但现在我有另一个问题。浏览器开始打开自定义身份验证弹出窗口。我必须解决这个问题。您不需要显式地执行此操作
$rootScope.authenticated=false代码>或$location.path(“/home”)代码>。您的配置应该足以注销用户,您应该能够执行简单的post注销请求。不过,了解您正在使用的SpringSec版本会很有帮助。您可能希望在post请求中包含其他标题。我必须将$rootscope.authenticated=false设置为,因为某些视图隐藏或显示此参数的状态。我“我会尝试这个解决方案,如果它能起作用的话,我会用不同的方式来解决。谢谢。我试过你的解决方案,但没有成功。我编辑了这个问题。顺便说一句,我检查了你正在学习的教程的链接。乍一看,他们描述了如何处理CSRF
令牌。我的答案可能是无用的,您需要在通话中向spring控制器发送csrf令牌,因为spring安全性就是这样工作的。基于这些csrf令牌,只有通话经过验证和授权。感谢您的关注。那么,我们必须禁用csrf吗?我的意思是我们必须确保我们的应用程序的会话安全,对吗?如果我得到了正确的答案,我将csrf令牌作为来自angular js的所有请求头发送。你知道我该怎么做吗?不幸的是,我对angular不太熟悉,但我想你下面的Spring Sec支持和教程的链接应该会给你一些启示。祝你好运:)请查看stackoverflow.com/a/45455423/5707108。
$httpProvider.defaults.xsrfHeaderName = 'X-CSRF-TOKEN';
$httpProvider.interceptors.push('CsrfTokenInterceptorService');