Отправка сообщений с сервера клиенту и вывод их в поле
Есть небольшое приложение на spring boot, которое в сервисе вызывает метод setMessage во многих местах, для вывода пользователю уведомлений, ошибок в результате проверки и т.д. и html форма с textarea куда выводятся эти уведомления..
Для вывода уведомлений используется Server Sent Events, но проблема в том, что выводимые уведомления некорректно выводятся. Вместо кириллицы знаки ???. Как задать кодировку, чтобы выводилось в кириллице?
Форма html выглядит так:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:encoding="UTF-8">
<head>
<meta charset="UTF-8">
</head>
<body>
<div class="container">
<div class="form_wrapper">
<form th:method="post" action="/" th:object="${dates}">
<button type="button" onclick="postData()">Запустить</button>
<div class="log_wrapper">
<textarea class="logs" name="logs" id="logs"></textarea>
</div>
</form>
</div>
</div>
<script>
var source = new EventSource("/subscribe");
source.addEventListener("message", function(event) {
var log = document.getElementById("logs");
log.value += event.data + "\n";
});
</script>
<script>
function postData() {
var formData = new FormData(document.querySelector("form"));
fetch("/", {
method: "POST",
body: formData,
})
.then((response) => {
if (response.ok) {
return response.text();
} else {
throw new Error("Ошибка запроса.");
}
})
.then((result) => {
alert(result);
})
.catch((error) => {
alert(error);
});
}
</script>
</body>
</html>
Контроллер:
@Controller public class MainController {
private final CreateFile createFile;
@Autowired
public MainController(CreateFile createFile) {
this.CreateFile = createFile;
}
@GetMapping("/")
public String main() {
return "index";
}
@PostMapping("/")
public ResponseEntity<String> post() {
createFile.method1();
createFile.method2();
return ResponseEntity.ok("Выполнение успешно завершено!");
}
@GetMapping("/subscribe")
public SseEmitter subscribe() {
return createFile.subscribe();
}
}
И сам класс CreateFile
@Service
public class CreateFile {
private final List<SseEmitter> emitters = new CopyOnWriteArrayList<>();
private String message = "";
@Autowired
public CreateFile() {
}
public void setMessage(String message) {
for (SseEmitter emitter : emitters) {
try {
emitter.send(SseEmitter.event().data(message));
} catch (IOException e) {
emitters.remove(emitter);
}
}
}
public SseEmitter subscribe() {
SseEmitter emitter = new SseEmitter();
emitters.add(emitter);
emitter.onCompletion(() -> emitters.remove(emitter));
return emitter;
}
public String getMessage() {
return message;
}
public void method1() {
if(...) {
setMessage("Сообщение 1");
}
if(...) {
setMessage("Сообщение 2");
}
***
if(...) {
setMessage("Сообщение n");
}
}
public void method1() {
if(...) {
setMessage("Сообщение 1");
}
if(...) {
setMessage("Сообщение 2");
}
***
if(...) {
setMessage("Сообщение n");
}
}
}