8

我需要用 Java 实现我自己的 HttpSession 版本。我发现很少有信息可以解释如何实现这一壮举。

我想我的问题是 - 无论应用程序服务器的实现如何,我如何覆盖现有的 HttpSession?

我确实遇到了质量但相当古老的读物,这有助于我实现我的目标 - http://java.sun.com/developer/technicalArticles/Servlets/ServletControl/

还有其他方法吗?

4

3 回答 3

8

它有两种方式。

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您的 Servlet 容器提供的内容中。

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 的开头设置您的过滤器,以确保它在任何其他文件之前执行。

实现它的第二种方式是向您的 Servlet 容器提供您的自定义 SessionManager。

例如,在Tomcat 7中。

于 2016-01-28T01:54:47.027 回答
5

创建一个新类,并实现 HttpSession:

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

    // and implement all the methods

}

免责声明:我自己没有对此进行测试:

然后用 /* 和 extend 的 url-pattern 编写一个过滤器HttpServletRequestWrapper。您的包装器应返回您的自定义HttpSessiongetSession(boolean)。在过滤器中,使用您自己的HttpServletRequestWrapper.

于 2011-08-21T17:08:01.203 回答
1

由于 HttpSession 实现是由 J2EE 容器提供的,因此以可移植方式在不同容器之间工作似乎并不容易。

但是,要获得类似的结果,您可以实现 javax.servlet.Filter 和 javax.servlet.HttpSessionListener 并在您的过滤器中包装 ServletRequest 和 ServletResponse,如Spring Boot with Hazelcast 和 Tomcat中所述。

于 2014-12-29T23:06:55.053 回答