Подтвердить что ты не робот

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");
}
4b9b3361

Ответ 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.
}

Подробнее см.