Существует несколько способов получить и использовать сеанс Http с веб-приложением на основе Spring. Это обобщение, основанное на опыте недавнего проекта.
Подход 1
Просто введите в HttpSession, где это требуется.
1
2
3
4
5
6
7
8
|
@Service public 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
|
@Controller public 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. |