Как настроить бин Session-Scoped, чтобы иметь возможность доступа к информации из запроса и из других сервисов? - PullRequest
2 голосов
/ 17 июля 2011

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

Он также должен иметь возможность доступа к userService - другому компоненту.

Что нужно для доступа к этим ресурсам?

@Configuration
public class ExceptionResolverBuilder 
{
    @Bean @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public ExceptionResolver getExceptionResolver() 
    {

        ExceptionResolver er = new ExceptionResolver();

        User user = userService.getLoggedInUser(request);

        if(user.isAdmin())
        {
            sendEmail("Caught exception:" + exeption.getMessage());
        }
        else
        {
            writeLog("Caught exception:" + exeption.getMessage());              
        }

        return er;
    }

}

Ответы [ 3 ]

1 голос
/ 17 июля 2011

Скорее досадно, bean-объекты в области сеанса не получают легкий доступ к запросу, инициировавшему сеанс.

Однако в вашем случае вам это не нужно.Если предположить, что ваш ExceptionResolver является реализацией HandlerExceptionResolver, то нет смысла помещать вашу логику регистрации в ExceptionResolverBuilder.getExceptionResolver(), так как преобразователь получит текущий HttpServletRequest в resolveExceptionmethod.

Также рассмотрите возможность использования аннотации @ExceptionResolver, которая делает жизнь еще проще, а также получает доступ к текущему запросу .

0 голосов
/ 17 июля 2011

Для компонента, который определен как @Component, вы можете автоматически связать запрос HttpServletRequest следующим образом:

@Component
@Scope("session")
public class Foo {
    @Autowired private HTTPServletRequest request;

    //
}

Но так как вы используете @Bean, вы не можете этого сделать.

Вы можете получить текущий запрос следующим образом:

    ServletRequestAttributes sra = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
    HttpServletRequest req = sra.getRequest();     

Используется локальный поток под обложками.

Если вы используете Spring MVC, это все, что вам нужно. Если вы не используете Spring MVC, вам нужно зарегистрировать RequestContextListener или RequestContextFilter в вашем web.xml.

0 голосов
/ 17 июля 2011

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

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

Если вы используете SpringSecurity, вы получите информацию для аутентификации текущего запроса, позвонив по номеру SecurityContext.getContext(). (Обычно для этого используется локальный поток.) ​​Однако я не уверен, что это сработает, поскольку ваш метод может быть вызван в тот момент, когда контекст безопасности не установлен.

Он также должен иметь возможность доступа к сервису пользователя - другому компоненту.

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

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