将信息从servlet发送回Filter

时间:2017-07-17 20:40:48

标签: java servlets tomcat7 servlet-filters

我有一个在Tomcat 7上运行的旧Web应用程序,它使用过滤器提供的非常基本的开放式会话视图机制:

@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 个答案:

答案 0 :(得分:1)

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

  1. 您的交易取决于其他设置了旗帜的人。如果你在银行工作,我真的不想成为那里的客户。
  2. 如果不清理线程本地存储,则资源泄漏。
  3. 如果不在线程本地存储之间手动复制内容,则无法编写多线程代码。
  4. 如果使用请求属性,则必须在Servlet中提取值并一直传递给DAO,假设您使用的是通用的多层体系结构。
  5. 相反,您可以简单地从Hibernate会话对象获取当前事务并要求它回滚。 RUN!SUCCESS 。最好的,废弃代码或找到编写它的人并要求退款。