У меня есть следующая страница листа тимьяна:
<!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")
}
Почему это не работает должным образом?