Как реализовать пользовательские http сессии в Java? - PullRequest
6 голосов
/ 21 августа 2011

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 28 января 2016

Два способа.

"Обертывание" оригинала 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.

4 голосов
/ 21 августа 2011

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

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

    // and implement all the methods

}

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

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

1 голос
/ 30 декабря 2014

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

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

...