Доступ к атрибутам сеанса Spring MVC - PullRequest
21 голосов
/ 06 февраля 2010

Есть ли какой-либо способ под 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");
}

Ответы [ 3 ]

25 голосов
/ 06 февраля 2010

Примечание @SessionAttribute, упомянутое @uthark, не подходит для этой задачи - я тоже так думал, но бит чтения показывает иначе:

Атрибуты сеанса, как указано с помощью эта аннотация соответствует атрибуты модели конкретного обработчика, прозрачно хранится в разговорный сеанс. Те атрибуты будут удалены, как только обработчик указывает завершение его разговорный сеанс. Поэтому используйте это средство для такого разговорного атрибуты, которые должны быть временно сохраняется в сеансе в течение определенного разговор хендлера.

Для постоянных атрибутов сеанса, например, объект аутентификации пользователя, используйте традиционный session.setAttribute метод вместо С другой стороны, рассмотреть возможность использования атрибута Возможности управления общего Интерфейс WebRequest.

Другими словами, @SessionAttribute предназначен для хранения объектов MVC-модели диалога в сеансе (в отличие от хранения их в качестве атрибутов запроса). Он не предназначен для использования с произвольными атрибутами сеанса. Как вы обнаружили, он работает только в том случае, если атрибут сессии всегда присутствует.

Я не знаю никакой другой альтернативы, я думаю, что вы застряли с HttpSession.getAttribute()

8 голосов
/ 07 февраля 2010

Вы можете использовать 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();
}

Для сквозных задач, таких как безопасность, этот подход лучше, потому что вам не нужно изменять сигнатуры контроллера.

5 голосов
/ 06 февраля 2010

Да, вы можете.

@SessionAttributes("userSecurityContext")
public class UserSecurityContext {
}

@RequestMapping("/myHomePage")
public String show(@ModelAttribute("userSecurityContext") UserSecurityContext u) {
    // code goes here.
}

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

  1. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/SessionAttributes.html

  2. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...