Spring доступ атрибута сессии MVC

Есть ли какой-либо путь под пружиной 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");
}
21
задан skaffman 6 February 2010 в 17:50
поделиться

3 ответа

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

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

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

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

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

25
ответ дан 29 November 2019 в 20:48
поделиться

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

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

8
ответ дан 29 November 2019 в 20:48
поделиться

Да, ты можешь.

@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

5
ответ дан 29 November 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: