我需要用 Java 实现我自己的 HttpSession 版本。我发现很少有信息可以解释如何实现这一壮举。
我想我的问题是 - 无论应用程序服务器的实现如何,我如何覆盖现有的 HttpSession?
我确实遇到了质量但相当古老的读物,这有助于我实现我的目标 - http://java.sun.com/developer/technicalArticles/Servlets/ServletControl/
还有其他方法吗?
我需要用 Java 实现我自己的 HttpSession 版本。我发现很少有信息可以解释如何实现这一壮举。
我想我的问题是 - 无论应用程序服务器的实现如何,我如何覆盖现有的 HttpSession?
我确实遇到了质量但相当古老的读物,这有助于我实现我的目标 - http://java.sun.com/developer/technicalArticles/Servlets/ServletControl/
还有其他方法吗?
它有两种方式。
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中。
创建一个新类,并实现 HttpSession:
public class MyHttpSession implements javax.servlet.http.HttpSession {
// and implement all the methods
}
免责声明:我自己没有对此进行测试:
然后用 /* 和 extend 的 url-pattern 编写一个过滤器HttpServletRequestWrapper
。您的包装器应返回您的自定义HttpSession
类getSession(boolean)
。在过滤器中,使用您自己的HttpServletRequestWrapper
.
由于 HttpSession 实现是由 J2EE 容器提供的,因此以可移植方式在不同容器之间工作似乎并不容易。
但是,要获得类似的结果,您可以实现 javax.servlet.Filter 和 javax.servlet.HttpSessionListener 并在您的过滤器中包装 ServletRequest 和 ServletResponse,如Spring Boot with Hazelcast 和 Tomcat中所述。