Как сохранить данные между запросами на веб-сервисе?

Предположим, я разрабатываю веб-сервис заказа билетов. Есть несколько шагов, чтобы заказать билет, и между шагами нужно хранить данные некоторых пользователей.

Предположим, я использую стек технологий Spring (Boot) и MVC

Как лучше это реализовать?

  1. Использовать REST без сохранения состояния и перемещать дату назад и вперед от шага к шагу, используя куки?
  2. Сохранить это в контексте сеанса?
  3. Используйте бины с состоянием (как они выглядят в Spring? Prototype?)
  4. Используйте некоторый протокол с отслеживанием состояния, такой как 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;
    }

}
Другие вопросы по тегам