java - HTTP 状态 403 - 未找到预期的 CSRF token

标签 java angularjs http spring-mvc spring-security

我正在从 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.
    });

最佳答案

我找到了解决这个问题的方法。

我发现 spring 会将以下两个属性添加到我将返回的 JSP View 中

`${_csrf.token}` and `${_csrf.headerName}`

我正在 JSPmeta 标记中收集这些属性

<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 token -

        $http({
            method: 'POST',

            headers: {
                'X-CSRF-TOKEN': getMetaContentByName('_csrf');
            },

            url: requestURL,
            data: data
        }).
        success(function (data, status, headers, config) {

            $log.info("data : " + data);


        })

关于java - HTTP 状态 403 - 未找到预期的 CSRF token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31723417/

相关文章:

javascript - 使用angularjs提取字节数组中的多个文件内容

javascript - 是否可以在另一个请求中有一个 Angular js $http 请求?

javascript - 在 JavaScript 中访问网页的 HTTP header

java - 为什么 OPTIMISTIC_FORCE_INCREMENT 不增加二级缓存中的版本

java限制列表项

javascript - 以 Angular 或其他方式创建响应式顶部菜单(就像 Chrome 在调整页面大小时使用书签栏一样)

http - 通过 HTTP 获取私有(private) GitLab 仓库

html - PHP : When submitting an HTML form, 是否设置了 HTTP_REFERER?

java - 如何解析字符串 "Mon Oct 22 03:00:26 +0000 2012"

java - 尽管行数超过 1,但 JTable 仅显示 1 行