Существует несколько способов получить и использовать сеанс Http с веб-приложением на основе Spring. Это обобщение, основанное на опыте недавнего проекта.
Подход 1
Просто введите в HttpSession, где это требуется.
|
1
2
3
4
5
6
7
8
|
@Servicepublic class ShoppingCartService { @Autowired private HttpSession httpSession; ...} |
Хотя это и удивительно, так как обслуживание выше — одноразовое, это работает хорошо. Spring интеллектуально внедряет в прокси фактическую сессию HttpSession, и этот прокси-сервер знает, как внутренне делегировать нужному сеансу для запроса.
Однако уловка обработки сеанса заключается в том, что объект, который извлекается и сохраняется в сеансе, должен управляться пользователем:
|
1
2
3
4
5
|
public void removeFromCart(long productId) { ShoppingCart shoppingCart = getShoppingCartInSession(); shoppingCart.removeItemFromCart(productId); updateCartInSession(shoppingCart);} |
Подход 2
Примите это как параметр, это будет работать только на веб-уровне:
|
1
2
3
4
5
6
7
8
9
|
@Controllerpublic class ShoppingCartController { @RequestMapping("/addToCart") public String addToCart(long productId, HttpSession httpSession) { //do something with the httpSession }} |
Подход 3
Создайте bean-компонент и поместите его в сеанс следующим образом:
|
1
2
3
4
5
|
@Component@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="session")public class ShoppingCart implements Serializable{...} |
Spring создает прокси для сессионного компонента и делает его доступным для сервисов, внедряющих в этот компонент. Преимущество использования этого подхода состоит в том, что любые изменения состояния этого компонента обрабатываются Spring, он позаботится о получении этого компонента из сеанса и распространении любых изменений в компоненте обратно в сеанс. Кроме того, если боб должен иметь какие-либо методы жизненного цикла Spring (скажем, методы @PostConstruct или @PreDestroy), они будут вызваны соответствующим образом.
Подход 4
Аннотирование атрибутов модели Spring MVC с помощью аннотации @SessionAttribute:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
@SessionAttributes("shoppingCart")public class OrderFlowController { public String step1(@ModelAttribute("shoppingCart") ShoppingCart shoppingCart) { } public String step2(@ModelAttribute("shoppingCart") ShoppingCart shoppingCart) { } public String step3(@ModelAttribute("shoppingCart") ShoppingCart shoppingCart, SessionStatus status) { status.setComplete(); } } |
Вариант использования для использования аннотации SessionAttributes очень специфичен для хранения состояния во время потока, как описано выше.
Учитывая эти подходы, я лично предпочитаю Подход 3 использования bean-объектов сессионной области, таким образом, в зависимости от Spring, чтобы управлять базовыми деталями извлечения и сохранения объекта в сеансе. Другие подходы имеют ценность, хотя и основаны на сценарии, с которым вы можете столкнуться, начиная от необходимости большего контроля над необработанными Http-сессиями до необходимости обрабатывать временное состояние, как в подходе 4 выше.
| Ссылка: | Использование сеанса Http с веб-приложениями на основе Spring от нашего партнера по JCG Биджу Кунджуммена в блоге all and sundry. |