是否保证延迟重定向,直到处理完所有servlet过滤器?

时间:2014-11-11 16:28:26

标签: java servlets redirect weblogic servlet-filters

我有一个带有两个servlet的Java Web应用程序。一个servlet用于创建新用户帐户,另一个用于编辑现有用户帐户(给定其唯一ID)。

如果调用了servlet 1(" / create-user"),它会生成一个具有唯一ID的新用户帐户,然后向servlet 2发出重定向:" / edit-user? UID = 123&#34 ;.然后,Servlet 2加载给定用户帐户的数据。

现在特别的事: 两个servlet执行的所有操作都在一种事务中执行。事务由servlet过滤器(伪代码)启动并最终提交:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    Transaction t = Transaction.startTransaction();
    try {
        chain.doFilter(request, response);
    } finally {
        t.commit();
    }
}

在提交事务之前,servlet 1生成的用户帐户对外部世界(以及servlet 2)不可见。

这在基于各种版本的Tomcat,WebSphere和JBoss的100多个安装上非常完美。但是有一个基于WebLogic 10.3.5.0的安装,我们在servlet 2中得到一个异常,因为它无法找到用户帐户。似乎重定向指令被发送回客户端,并且客户端在servlet过滤器对原始请求进行后处理之前将其发送到服务器。因此,新用户帐户尚未提交,servlet 2无法加载其数据。

我知道重定向是实现为"位置" HTTP响应头。我还知道,在服务器端生成完整响应之前,Web服务器可能会开始向客户端发送数据(从响应头开始)。但是,在完全处理原始HTTP请求之前,是否允许客户端遵循重定向?在重定向发生之前,是否不能保证原始请求已经完全处理(包括所有servlet过滤器)?

1 个答案:

答案 0 :(得分:0)

您不应使用servlet过滤器来处理用户事务。它必须围绕servlet完成。如果交易失败怎么办?您没有办法发送错误页面,因为HTTP响应可能已经提交。

在您的情况下,在您的过滤器提交之前,http响应可能已经发送到客户端。

我建议重构你的代码,将事务方面设置到你的servlet中,你的问题肯定会消失。