Есть ли какой-либо путь под пружиной 3.0 для доступа к HttpSession без включения его в сигнатуре метода? То, что я действительно хочу сделать, быть в состоянии передать в значениях из HttpSession тот CAN БЫТЬ пустым.
Что-то вроде этого:
@RequestMapping("/myHomePage")
public ModelAndView show(UserSecurityContext ctx) {}
вместо этого:
@RequestMapping("/myHomePage")
public ModelAndView show(HttpSession session) {
UserSecurityContext ctx = (UserSecurityContext) session.getAttribute("userSecurityCtx");
}
Аннотация @SessionAttribute
, упомянутая @uthark, не подходит для этой задачи - я думал, что это тоже, но бит чтения показывает иное:
Атрибуты сеанса как указанные с помощью этой аннотации соответствуют атрибутам модели конкретного обработчика , которые прозрачно сохраняются в диалоговом сеансе . Эти атрибуты будут удалены, как только обработчик укажет на завершение своего диалогового сеанса . Поэтому используйте это средство для таких диалоговых атрибутов, которые должны временно храниться в сеансе в течение определенного разговор обработчика.
Для постоянных атрибутов сеанса, например объекта аутентификации пользователя, используйте вместо него традиционный метод session.setAttribute . В качестве альтернативы рассмотрите возможность использования возможностей управления атрибутами общего интерфейса WebRequest.
Другими словами, @SessionAttribute
предназначен для хранения объектов MVC-модели диалога в сеансе (в отличие от хранения их как атрибутов запроса). Он не предназначен для использования с произвольными атрибутами сеанса. Как вы обнаружили, это работает, только если атрибут сеанса всегда присутствует.
Я не знаю другой альтернативы, я думаю, вы застряли с HttpSession.getAttribute ()
Вы можете использовать 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();
}
Для межсекторных проблем, таких как безопасность, такой подход лучше, потому что вам не нужно изменять подписи контроллера.
Да, ты можешь.
@SessionAttributes("userSecurityContext")
public class UserSecurityContext {
}
@RequestMapping("/myHomePage")
public String show(@ModelAttribute("userSecurityContext") UserSecurityContext u) {
// code goes here.
}
Смотрите подробности: