Извлечение информации о пользователе Spring Session в слое Dao - PullRequest
4 голосов
/ 07 октября 2010

У меня есть веб-приложение на Java, Spring Framework, Hibernate на Tomcat, которое практически не имеет защиты, кроме функций входа и выхода из системы (нет Spring Security).контроллер по:

// where request is HttpServletRequest
 HttpSession session = request.getSession(true);
 SystemUser user = (SystemUser) session.getAttribute("user");

и сделать логику.Однако мне нужно получить эту информацию в слое Дао.Где я на самом деле получить данные из базы данных для получения пользовательских данных.Одним из способов является передача объекта «пользователь» на уровень обслуживания, а затем уровень обслуживания для передачи его на уровень дао.Но это довольно большой груз работы.

Интересно, есть ли в Spring способ, как получить доступ к объекту сеанса в слое Dao?или любым другим способом получения пользовательских данных.

Ответы [ 2 ]

10 голосов
/ 07 октября 2010

Вы можете использовать RequestContextHolder:

ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpSession session = requestAttributes.getRequest().getSession();

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

Редактировать: Как правильно заметил Фейсал, это, как правило, не очень хорошая идея, поскольку это приводит к нежелательному связыванию и сложному тестированию кода.Однако в некоторых случаях это неизбежно, например, когда интерфейс с вашим кодом является фиксированным (например, устаревшие сервисы или библиотека тегов JSP и т. Д.).

8 голосов
/ 07 октября 2010

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

Что если вы хотите использовать ваши классы DAO вне веб-приложения?

DAO, обращающийся к некоторому типу держателя контекста запроса, ставит вопрос о том, какие данные необходимы для метода DAO для запуска скрытого секрета - вместо того, чтобы объявлять параметр метода для данных, которые ему нужны, он тайно обращается к статическому методу в некотором классе .

Это приводит к трудному для тестирования и трудному для понимания коду.

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