Tomcat: как получить доступ к (сессионному) менеджеру из сервлета - PullRequest
6 голосов
/ 27 апреля 2011

Мне нужно получить доступ к Менеджеру из сервлета (или фильтра) в Tomcat, чтобы загрузить пользовательский сеанс по пользовательскому идентификатору сеанса.

Ответ на ваш следующий вопрос: зачем он мне нужен.Во Flash есть старая ошибка, которая заставляет его отправлять куки из IE, а не из текущего браузера.Итак, если я в FF и пытаюсь загрузить файл с помощью SWFUpload, я получаю неправильный сеанс и ошибку.

Я хочу добавить магический параметр в POST, который должен переопределить значение по умолчанию(неправильный) идентификатор сеанса, затем загрузите пользовательский сеанс вместо сеанса, загруженного Tomcat.Я не могу использовать перезапись URL-адреса, так как файлы cookie разрешаются первыми, и когда flash отправляет неправильный файл cookie из IE, Tomcat не пытается загрузить сеанс с переписанного URL-адреса.

Буду признателен за любую другую подсказкукак получить доступ к диспетчеру из контекста или решение исходной проблемы.

Заранее спасибо, Юрий

Ответы [ 3 ]

6 голосов
/ 03 сентября 2014

В отличие от кода Ihor , этот код использует немного меньше абстракции, получая Manager от HttpSession:

private Manager manager(HttpSession session) throws Exception {

    Field facadeSessionField = StandardSessionFacade.class.getDeclaredField("session");
    facadeSessionField.setAccessible(true);
    StandardSession stdSession = (StandardSession) facadeSessionField.get(session);

    return stdSession.getManager();
}
5 голосов
/ 14 февраля 2013

для Tomcat:

   ApplicationContextFacade appContextFacadeObj = (ApplicationContextFacade)    request.getSession().getServletContext();

    try
    {
        Field applicationContextField = appContextFacadeObj.getClass().getDeclaredField("context");
        applicationContextField.setAccessible(true);
        ApplicationContext appContextObj = (ApplicationContext) applicationContextField.get(appContextFacadeObj);
        Field standardContextField = appContextObj.getClass().getDeclaredField("context");
        standardContextField.setAccessible(true);
        StandardContext standardContextObj = (StandardContext) standardContextField.get(appContextObj);
        Manager persistenceManager = standardContextObj.getManager();
    }
    catch(SecurityException e)
    {
        logger.error(e);
    }
    catch(NoSuchFieldException e)
    {
        logger.error(e);
    }
    catch(IllegalArgumentException e)
    {
        logger.error(e);
    }
    catch(IllegalAccessException e)
    {
        logger.error(e);
    }
4 голосов
/ 27 апреля 2011

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

(я не смог найти, выставлен ли менеджер в JNDI, но вы также можете посмотреть там)

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