Spring Boot - как сделать разные ресурсы для разных пользователей - PullRequest
1 голос
/ 16 февраля 2020

Я пишу приложение для весенней загрузки и столкнулся с проблемой совместного использования ресурсов для разных пользователей. Упрощенно на примере это выглядит так: есть одна переменная. Вы можете присвоить ему значение через форму на странице. Если первый пользователь назначит значение hello java из одного браузера, то второй пользователь увидит то же значение через другой браузер. Я не знаю, как заставить каждого пользователя работать со своей собственной переменной, и их значения не перекрываются?

Контроллер:

@Controller
public class MessageController {
    private String message;

    @GetMapping(value = "/show_message")
    public String showMessage(Model model){
        model.addAttribute("message", message);
        return "message";
    }

    @PostMapping(value = "set_message")
    public String setMessage(@RequestParam(name = "newMessage") String newMessage){
        message = newMessage;
        return "redirect:/show_message";
    }
}

html страница:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">

</head>
<body>
<p>Message value: <th:block th:utext="${message}"/></p>

<p>Enter a new message value</p>
<form method="POST" th:action="@{/set_message}">
    <input type="text" name="newMessage"/>
    <input type="submit" value="Send"/>
</form>
</body>
</html>

1 Ответ

0 голосов
/ 17 февраля 2020

Практическое правило заключается в том, что контроллеры и службы не предназначены для поддержания состояния, в частности, состояния клиента.
Кроме того, бины Spring по умолчанию являются одиночными: они являются общими для клиентов / запросов. Это объясняет поведение, которое вы замечаете.

Чтобы решить эту проблему, вы можете использовать HttpSession в памяти (старая практика), но это больше не рекомендуется, поскольку он привязывает клиента / пользователя к указанному c экземпляру сервера, который первым обработал его запрос. .
Желательно либо повторно отправлять данные при каждом запросе (что может быть затруднительно), либо лучше хранить данные в базе данных в памяти, такой как Redis.
Это быстро и не привязывает клиент к указанному c экземпляру вашего приложения весенней загрузки.

В Spring хорошая связь с использованием базы данных в памяти для обработки пользовательского состояния использует HttpSession, но Spring Session резервируется в базу данных (Redis или другую).
Для как использовать сессию с Spring MVC, у вас есть этот хороший пост .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...