Статьи

Использование сеанса Http с веб-приложениями на основе Spring

Существует несколько способов получить и использовать сеанс 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.