繁体   English   中英

HTTP状态403-找不到预期的CSRF令牌

[英]HTTP Status 403 - Expected CSRF token not found

我正在从角度$ http发布到服务器,并且得到

HTTP Status 403 - Expected CSRF token not found. 

正如我在这里可以找到的一种解决方案是禁用CSRF,但是我不确定那是我想要的。 请让我知道如何解决此问题。

我在前端使用Angular JS,在服务器端使用带有Spring security 3.2的Spring MVC 4。

编辑:

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视图中

`${_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令牌-

        $http({
            method: 'POST',

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

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

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


        })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM