Java spring boot js http:/localhost:8080/logout 403禁止的错误

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

我无法解决这个问题

我尝试创建一个提示登录注销示例。登录工作正常,但当我尝试注销时,浏览器显示NetworkError:403禁止本地主机:8080/禁止注销

在我看来,我应该在ui端的每个请求中添加令牌头。但我不知道如何才能做到这一点

以下是浏览器开发人员工具消息:

403后 {“timestamp”:1501570024381,“status”:403,“error”:“probled”,“message”:“无效的CSRF令牌'null'被删除” 在请求参数“\u csrf”或标题“X-csrf-TOKEN.”,“路径”中找到“/helpdesk/logout”}

以下是我的角度注销功能:

 $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');