gpt4 book ai didi

java - 如何在 spring mvc 中覆盖 getSession()

转载 作者:行者123 更新时间:2023-11-30 11:29:41 25 4
gpt4 key购买 nike

我正在开发一个网络应用程序,但遇到了 session 存储问题。

应用程序被部署到集群中,我们放置了一个 apache http 服务器来处理负载平衡。因此每个请求可能由集群中的不同节点处理。我们开始使用 Redis(主/从)作为共享 session 存储。

我的问题是如何将它插入 Spring mvc,这样我们就可以使用 redis 而不需要更改我们的应用程序代码。

我在网上找到了一个使用 Filter 和 HttpServletRequestWrapper 的解决方案:

public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
//get sessionId from cookie or generate one if not found
filterChain.doFilter(new CustomHttpServletRequestWrapper(sid, request),
servletResponse);
}

public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {

String sid = "";

public HttpServletRequestWrapper(String sid, HttpServletRequest arg0) {
super(arg0);
this.sid = sid;
}

public HttpSession getSession(boolean create) {
return new HttpSessionSidWrapper(this.sid, super.getSession(create));
}

public HttpSession getSession() {
return new HttpSessionSidWrapper(this.sid, super.getSession());
}
}

我想知道我是否可以在 spring mvc 中找到一个等价物?

我第一个想到的是HandlerInterceptor。但不像filter的api,HanlderIntercepor不处理链,所以没有办法将自定义请求传递给下一个拦截器。

如有任何想法,请提前致谢。

更新:

我发现了两个关于这个主题的策略:

第一个是扩展您的 Web 容器(例如 Tomcat),并且已经有一些成熟的开源项目专注于它。

第二种是使用过滤器+包装器。此策略与 Web 容器无关。

我个人更喜欢第一个,因为它对开发人员来说是透明的。假设我们在测试/生产环境中使用 Weblogic,并且我们使用嵌入式 jetty 进行开发,因为它更快并且需要更少的资源。在这种情况下,开发人员不必为开发设置 session 存储。但另一方面,如果我们采用第二种策略,每个开发人员都需要设置自己的 session 存储。替代解决方案是为开发环境提供共享 session 存储或一些配置以切换 session 存储策略(内置用于开发,共享用于测试/生产)。我认为通过 spring 执行依赖(配置)注入(inject)比通过原始 servlet 过滤器更容易,因此提出了这个问题。

顺便说一句,有谁知道 Weblogic 的第一个策略有开箱即用的实现吗?

最佳答案

我不知道 WebLogic session 存储配置选项,但我可以评论基于过滤器的策略

您可以实现过滤器以了解其环境。您可以为开发添加配置,这将显示“不包装请求”并仅在生产(或测试)环境中启用包装。

您可以将过滤器实现为 Spring 应用程序上下文感知(检查 WebApplicationContextUtils)或者甚至由 Spring 的应用程序上下文管理(通过 DelegatingFilterProxy)。然后您将能够提取配置值或使用 Spring 配置文件手动设置过滤器。

关于java - 如何在 spring mvc 中覆盖 getSession(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18181302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com