как реализовать пользовательскую http-сессию в java?

Мне нужно будет реализовать свою собственную версию HttpSession на Java. Я нашел очень мало информации, которая объясняет, как достичь такого подвига.

Я предполагаю, что моя проблема заключается в том, как переопределить существующий HttpSession независимо от реализации сервера приложений?

Я наткнулся на качественное, но довольно старое чтение, которое помогло мне достичь моей цели — http://java.sun.com/developer/technicalArticles/Servlets/ServletControl/

Есть ли другие подходы?


person plymouth5    schedule 20.08.2011    source источник
comment
АФАИК, это невозможно. Спецификация JEE не требует замены реализации HttpSession. Но главный вопрос: зачем вам это?   -  person JB Nizet    schedule 21.08.2011
comment
не уверен, нужно ли вам знать, как это реализовать, но проверьте это apl.jhu.edu/~hall/java/Servlet-Tutorial/   -  person eon    schedule 21.08.2011
comment
Что именно вам нужно сделать, чтобы реализовать HttpSession?   -  person CrackerJack9    schedule 21.08.2011


Ответы (3)


Два пути.

"Обертывание" исходного HttpSession в собственной реализации HttpServletRequestWrapper.

Я сделал это недавно для кластеризации распределенных сеансов с помощью Hazelcast и Spring Session.

Здесь объясняется очень хорошо.

Во-первых, реализуйте свои собственные HttpServletRequestWrapper

public class SessionRepositoryRequestWrapper extends HttpServletRequestWrapper {

        public SessionRepositoryRequestWrapper(HttpServletRequest original) {
                super(original);
        }

        public HttpSession getSession() {
                return getSession(true);
        }

        public HttpSession getSession(boolean createNew) {
                // create an HttpSession implementation from Spring Session
        }

        // ... other methods delegate to the original HttpServletRequest ...
}

После этого из вашего собственного фильтра оберните исходный HttpSession и поместите его внутрь FilterChain, предоставленного вашим контейнером сервлетов.

public class SessionRepositoryFilter implements Filter {

        public doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                SessionRepositoryRequestWrapper customRequest =
                        new SessionRepositoryRequestWrapper(httpRequest);

                chain.doFilter(customRequest, response, chain);
        }

        // ...
}

Наконец, установите свой фильтр в начале файла web.xml, чтобы убедиться, что он работает раньше любого другого.

Второй способ добиться этого — предоставить контейнеру сервлетов свой собственный SessionManager.

Например, в Tomcat 7.

person Dani    schedule 28.01.2016

Создайте новый класс и реализуйте HttpSession:

public class MyHttpSession implements javax.servlet.http.HttpSession {

    // and implement all the methods

}

Отказ от ответственности: я не проверял это сам:

Затем напишите фильтр с шаблоном URL /* и расширьте HttpServletRequestWrapper. Ваша оболочка должна вернуть ваш пользовательский класс HttpSession в getSession(boolean). В фильтре используйте свои HttpServletRequestWrapper.

person CrackerJack9    schedule 21.08.2011
comment
Да, это я знаю, но как заставить сервер приложений (например, Glassfish, WebLogic) возвращать MyHttpSession при вызове request.getSession()? - person plymouth5; 22.08.2011
comment
Какой сервер приложений вы используете? - person CrackerJack9; 22.08.2011
comment
Сегодня я использую Glassfish 3 - person plymouth5; 23.08.2011
comment
@ plymouth5 В своем пользовательском HttpServletRequestWrapper вы переопределяете оба метода getSession, чтобы вернуть свою пользовательскую реализацию сеанса. - person Jason Young; 24.08.2019

Не похоже, что это легко сделать переносимым образом, который будет работать между разными контейнерами, поскольку реализация HttpSession предоставляется контейнером J2EE.

Однако для достижения аналогичного результата вы можете реализовать javax.servlet.Filter и javax.servlet.HttpSessionListener и в своем фильтре обернуть ServletRequest и ServletResponse, например, как описано в Spring Boot с Hazelcast и Tomcat.

person lammy    schedule 29.12.2014