我有一个带有两个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过滤器)?
答案 0 :(得分:0)
您不应使用servlet过滤器来处理用户事务。它必须围绕servlet完成。如果交易失败怎么办?您没有办法发送错误页面,因为HTTP响应可能已经提交。
在您的情况下,在您的过滤器提交之前,http响应可能已经发送到客户端。
我建议重构你的代码,将事务方面设置到你的servlet中,你的问题肯定会消失。