Spring Доступ к атрибуту сеанса MVC
Есть ли способ под spring 3.0 для доступа к HttpSession без включения его в подпись метода? То, что я действительно хочу сделать, - это передать значения из HttpSession, которые могут быть пустыми.
Что-то вроде этого:
@RequestMapping("/myHomePage")
public ModelAndView show(UserSecurityContext ctx) {}
вместо этого:
@RequestMapping("/myHomePage")
public ModelAndView show(HttpSession session) {
UserSecurityContext ctx = (UserSecurityContext) session.getAttribute("userSecurityCtx");
}
Ответы
Ответ 1
Аннотация @SessionAttribute
, упомянутая @uthark, не подходит для этой задачи - я думал, что это тоже так, но бит чтения показывает в противном случае:
Атрибуты сеанса, указанные эта аннотация соответствует специфические атрибуты модели обработчика, прозрачно хранятся в разговорная сессия. Те атрибуты будут удалены после обработчик указывает на завершение разговорная сессия. Поэтому используйте это средство для таких разговорных атрибуты, которые должны быть хранится в сеансе временно в ходе конкретной обработчик.
Для постоянных атрибутов сеанса, например. объект аутентификации пользователя, используйте традиционный session.setAttribute вместо этого. С другой стороны, рассмотрите использование атрибута возможности управления общим Интерфейс WebRequest.
Другими словами, @SessionAttribute
предназначен для хранения объектов MVC-объектов разговора в сеансе (в отличие от их хранения в качестве атрибутов запроса). Он не предназначен для использования с произвольными атрибутами сеанса. Как вы обнаружили, он работает только в том случае, если атрибут сеанса всегда существует.
Я не знаю другой альтернативы, я думаю, что вы застряли с HttpSession.getAttribute()
Ответ 2
Вы можете использовать RequestContextHolder
:
class SecurityContextHolder {
public static UserSecurityContext currentSecurityContext() {
return (UserSecurityContext)
RequestContextHolder.currentRequestAttributes()
.getAttribute("userSecurityCtx", RequestAttributes.SCOPE_SESSION));
}
}
...
@RequestMapping("/myHomePage")
public ModelAndView show() {
UserSecurityContext ctx = SecurityContextHolder.currentSecurityContext();
}
Для сквозных задач, таких как безопасность, этот подход лучше, потому что вам не нужно изменять сигнатуры вашего контроллера.
Ответ 3
Да, вы можете.
@SessionAttributes("userSecurityContext")
public class UserSecurityContext {
}
@RequestMapping("/myHomePage")
public String show(@ModelAttribute("userSecurityContext") UserSecurityContext u) {
// code goes here.
}
Подробнее см.