我有一个带有两个servlet的Java web应用程序。一个servlet用于创建新用户帐户,另一个用于编辑现有用户帐户(给定其唯一id)。
如果调用servlet 1(/create-user),它将生成具有唯一id的新用户帐户,然后发出重定向到servlet 2:/edit-user?UID=123"。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过滤器)?
您不应该使用servlet过滤器来处理用户事务。它必须围绕servlet来完成。交易失败怎么办?您没有办法发送错误页面,因为HTTP响应可能已经提交。
在您的情况下,超文本传输协议响应可能在过滤器提交之前就已经发送到客户端了。
我建议重构您的代码,在servlet中设置一个事务方面,您的问题肯定会消失。
问题内容: 我正在尝试找到一种方法,可将请求从过滤器重定向到登录页面,但我不知道如何从servlet重定向。我搜索了,但发现的是方法。我在过滤器的响应对象上找不到此方法。是什么原因 我该如何解决? 问题答案: 在Filter中,响应是而不是。因此将强制转换为。 如果使用上下文路径: 也不要忘记在最后打电话。
我有一个servlet过滤器类。在doFilter函数中,我希望在chain.doFilter(请求,响应)调用之后重定向到一个自定义URL。
问题内容: 逻辑是过滤器被命中,条件不成立,因此它遍历过滤器链。提交响应后,过滤器将被命中,并且条件现在为true(已设置请求属性)。它可以执行转发,但是页面从不转发。我知道这与提交的响应有关,因为我在第一次到达链之前测试了转发的不同逻辑,并且确实转发成功。 我的部署描述符中的示例: 问题答案: an的“已提交”状态实际上是说明响应头是否已写入基础套接字的一种方式。“已提交”响应已(至少)写入了第
问题内容: 我有URLRewirteFilter,它检查请求的域是否以www开头。并重定向到无www网址。当要重定向请求时,如何停止进一步的处理(调用JSF应用程序,调用servlet等)?到目前为止,我有这个: 问题答案: 只需在末尾添加一条语句即可 或添加一个
如何在Vertx中处理延迟作业列表(实际上是数百个HTTP GET请求,到禁止快速请求主机的有限API)?现在,我正在使用此代码,它被阻止,因为Vertx一次启动所有请求。希望在每个请求之间有5秒的延迟来处理每个请求。
我在两台主机上部署了一个Java web应用程序,前面有一个servlet过滤器。我向一台主机上的应用程序发送了一个POST请求,该请求被过滤器拦截并重定向到另一台主机: 在第二台机器上,请求通过过滤器并由资源类中的REST API处理。 对象作为POST请求正文的一部分发送。重定向之后,请求正文不会发送过来,为空。如何在重定向之后保留请求正文(或至少保留请求正文的这一部分)? 谢了。