Как создать Object в классе, реализующем HandlerInterceptor, чтобы получить к нему доступ из любого места для этого запроса - PullRequest
0 голосов
/ 20 ноября 2018

У меня такая ситуация: в методе preHandle () класса, реализующего HandlerInterceptor, я получаю sessionId, получая входящий запрос объекта HttpServletRequest.Теперь, используя этот идентификатор сессии, я выбираю userInfo из БД.ту же информацию я должен использовать где-то еще, например, на уровне обслуживания, для обработки запроса.

Было бы очень полезно, если бы кто-нибудь из вас помог мне выполнить его.Заранее спасибо.

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете использовать ThreadLocal для хранения ссылки на пользователя, которая будет доступна только текущему потоку выполнения.

https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html

Вы можете заключить это в контекстный класстак что в вашем сервисе вы можете получить доступ к текущему пользователю через статический вызов: User user = UserContextUtils.getUser();

UserContextUtils:

public class UserContextUtils {

    private static final ThreadLocal<User> CONTEXT = new ThreadLocal<>();

    public static void setUser(User user) {
        CONTEXT.set(user);
    }

    public static User getUser() {
        return CONTEXT.get();
    }

    public static void clear() {
        CONTEXT.remove();
    }
}

Перехватчик:

public class MyHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, 
              HttpServletResponse response, Object handler)
            throws Exception {

        User user = null;// get user from the database.
        UserContextUtils.setUser(user);

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, 
             HttpServletResponse response, Object handler,
            Exception ex) {

        // as some web servers re-use threads, you must ensure that the 
        // context is cleared on completion either here or elsewhere.

        UserContextUtils.clear();
    }

    @Override
    public void postHandle(HttpServletRequest request, 
             HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

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