Как сохранить данные между запросами на веб-сервисе?
Предположим, я разрабатываю веб-сервис заказа билетов. Есть несколько шагов, чтобы заказать билет, и между шагами нужно хранить данные некоторых пользователей.
Предположим, я использую стек технологий Spring (Boot) и MVC
Как лучше это реализовать?
- Использовать REST без сохранения состояния и перемещать дату назад и вперед от шага к шагу, используя куки?
- Сохранить это в контексте сеанса?
- Используйте бины с состоянием (как они выглядят в Spring? Prototype?)
- Используйте некоторый протокол с отслеживанием состояния, такой как SOAP (это с состоянием?)
1 ответ
Это зависит.
1 Если вы хотите использовать несколько экземпляров вашего веб-сервиса (для балансировки нагрузки и т. Д.), Тогда вы выбираете REST без проверки состояния и аутентификацию на основе токенов.
2 Если вам не нужна эта функциональность, вы можете сохранить информацию о сеансе в MVC Model (в любом случае она будет помещена в сеанс)
@RestController
@SessionAttributes("armUserSession")
public class SessionController {
@Autowired
private LoginService loginService;
@ModelAttribute("armUserSession")
public ArmUserSession getArmUserSession() {
return new ArmUserSession();
}
@CrossOrigin
@RequestMapping({"/login"})
public ArmUserSession login(@ModelAttribute("armUserSession") ArmUserSession userSession,
Model model,
@RequestParam(required = false) String login,
@RequestParam(required = false) String password) {
if (!userSession.isLoggedIn()) {
userSession = loginService.login(login, password);
model.addAttribute("armUserSession", userSession);
}
return userSession;
}
@CrossOrigin
@RequestMapping({"/logout"})
public ArmUserSession logout(SessionStatus status) {
status.setComplete();
return new ArmUserSession();
}
}
3 Вы также можете использовать сессионные компоненты, но это немного сложнее. По умолчанию бобы Spring являются синглетонами. Если вы хотите использовать сессионный компонент (не синглтоны) в синглтоне, вам нужен прокси.
@Service
public class LoginServiceImpl implements LoginService {
@Autowired
private ArmUserSessionProxy armUserSessionProxy;
@Override
public ArmUserSession login(String login, String password) {
ArmUserSession armUserSession = armUserSessionProxy.getArmUserSession();
...................................
}
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ArmUserSessionProxy {
private ArmUserSession armUserSession = new ArmUserSession();
public ArmUserSession getArmUserSession() {
return armUserSession;
}
}