Cookies.get ('XSRF-TOKEN') возвращает неопределенное значение (весенние веб-файлы) - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть следующая страница листа тимьяна:

<!DOCTYPE html>
<html lang="en" ng-app="springChat" xmlns:th="http://www.springframework.org/schema/beans">
<head>
    <meta charset="utf-8"/>
    <title>Spring WebSocket Chat</title>
    <script type="text/javascript" src="/webjars/js-cookie/js.cookie.js"></script>
    <script src="/webjars/jquery/jquery.min.js"></script>

    <meta name="_csrf" th:content="${_csrf.token}"/>
    <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
    <meta name="_csrf_parameter_name" th:content="${_csrf.parameterName}"/>
</head
.....

и к этой странице я прикрепил следующие js:

function connect() {
    var socket = new SockJS('/gs-guide-websocket');
    stompClient = Stomp.over(socket);

    var token = $("meta[name='_csrf']").attr("content");
    var paramName = $("meta[name='_csrf_parameter_name']").attr("content");
    var csrfHeader = $("meta[name='_csrf_header']").attr("content");

    //$('<input>').attr('type', 'hidden').attr('name', csrfHeader).attr('value', token).appendTo('#login-form');
    var headers = {};
    headers[csrfHeader] = token;

    stompClient.connect(headers, function (frame) {...));

}

Работает нормально. Я вижу, что он отправляет токен csrf на сервер.

Когда я читаю учебник весны Я обнаружил интересную особенность новой весны:

если добавить на страницу <script type="text/javascript" src="/webjars/js-cookie/js.cookie.js"></script>, вы можете использовать следующую строку для получения токена:

Cookies.get('XSRF-TOKEN')

Содержится в зависимости:

compile("org.webjars:js-cookie:2.1.0")

Итак, я добавил его и написал следующий код:

function connect() {
    var socket = new SockJS('/gs-guide-websocket');
    stompClient = Stomp.over(socket);

    var headers = {};
    headers["X-XSRF-TOKEN"] = Cookies.get('XSRF-TOKEN');

    stompClient.connect(headers, function (frame) {...));

}

консоль браузера:

Opening Web Socket...
stomp.min.js:8 Web Socket Opened...
stomp.min.js:8 >>> CONNECT
X-XSRF-TOKEN:undefined
accept-version:1.1,1.0
heart-beat:10000,10000

<<< ERROR
message:Failed to send message to ExecutorSubscribableChannel[clientInboundChannel]; nested exception is org.springframework.security.web.csrf.InvalidCsrfTokenException\c Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
content-length:0

build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

jar {
    baseName = 'gs-messaging-stomp-websocket'
    version = '0.1.0'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-websocket")
    compile("org.webjars:webjars-locator-core")
    compile("org.webjars:sockjs-client:1.0.2")
    compile("org.webjars:stomp-websocket:2.3.3")
    compile("org.webjars:bootstrap:3.3.7")
    compile("org.webjars:jquery:3.1.0")
    compile("org.webjars:js-cookie:2.1.0")
    compile('org.thymeleaf:thymeleaf-spring5');

    compile("org.springframework.boot:spring-boot-starter-actuator")
    //security
    compile ('org.springframework.security:spring-security-messaging')
    compile group: 'org.springframework.security', name: 'spring-security-web'
    compile group: 'org.springframework.security', name: 'spring-security-config'

    testCompile("org.springframework.boot:spring-boot-starter-test")
}

Почему это не работает должным образом?

1 Ответ

0 голосов
/ 01 мая 2018

JavaScript не разрешено читать куки, если куки HttpOnly или куки принадлежат другому домену или контекстному пути.

Убедитесь, что вы создали бин csrfTokenRepository с CookieCsrfTokenRepository.withHttpOnlyFalse()

...