gpt4 book ai didi

java - 将信息从 servlet 发送回 Filter

转载 作者:行者123 更新时间:2023-12-02 12:35:51 26 4
gpt4 key购买 nike

我有一个旧的 Web 应用程序,在 Tomcat 7 上运行,它使用由过滤器提供的非常基本的 open-session-in-view 机制:

@Override public void doFilter (ServletRequest req, ServletResponse resp, FilterChain fc) 
throws IOException, ServletException
{
try {
HibernateUtil.beginTransaction();
fc.doFilter(req, resp);
HibernateUtil.commitTransaction();
} catch (Throwable t) {
Logger.exception(t, "processing servlet request");
HibernateUtil.rollbackTransaction();
throw new ServletException(t);
}
}

我现在陷入了困境,我认为我遇到了 OSIV(或至少是它的实现)的众多缺陷之一,即我现在希望能够回滚事务,甚至没有抛出异常。我希望 servlet 能够控制这一点,而且我认为除了以某种方式破解此功能之外我没有太多选择。

我的问题是:如何将某种“回滚”标志从任意 servlet 传送回此过滤器?我希望能够在过滤器中执行类似的操作:

HibernateUtil.beginTransaction();
fc.doFilter(req, resp);
if (/* something that was set by a servlet/jsp */)
HibernateUtil.rollbackTransaction();
else
HibernateUtil.commitTransaction();

我不太确定将信息从 servlet 传播回此过滤器的可靠方法是什么。

最佳答案

我不建议使用请求属性或线程局部变量,这存在以下问题:

  1. 您的交易取决于其他人设置的标志。如果你在银行工作,我真的不想成为那里的客户。
  2. 如果不清理线程本地存储,就会发生资源泄漏。
  3. 如果不手动在线程本地存储之间复制内容,就无法编写多线程代码。
  4. 如果使用请求属性,则必须在 Servlet 中提取值并一直传递到 DAO(假设您使用的是通用的多层架构)。

相反,您可以简单地从 Hibernate session 对象获取当前事务并要求它回滚。 Session.getTransaction().rollback()。最好,废弃该代码或找到编写该代码的人并要求退款。

关于java - 将信息从 servlet 发送回 Filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45153311/

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