Struts2 中的 Jakarta 没有链重定向(上传大文件)

No chain redirection with Jakarta in Struts2 (Uploading big files)

我正在用 struts2 制作一个新项目。很好,但我不知道在这种情况下发生了什么。

项目有链重定向当业务逻辑失败时,其return到最后JSP(最后一个动作),重新加载成功所有没有编程工作的页面(它也重新加载旧请求)。

无论如何,当 Jakarta 检测到用户正在尝试上传大文件(默认配置为 20 MB)时,操作逻辑知道并强制链重定向到最后一个操作。

我调试这个逻辑。我有一个拦截器可以做几件事,在典型的行中:

result = invocation.invoke();

当 Jakarta 强制链重定向时,拦截器捕获了这个新请求,但是没有通过 invoke 方法到达操作

我不知道为什么会这样。当相同的操作强制执行相同的链重定向时,因为其他验证(例如 struts2 的 FileUpload 拦截器或拥有验证)都可以正常工作。

我在程序中解决了避免重定向,但我想知道为什么我不能使用我的普通模式

部分struts.xml:

<constant name="struts.multipart.maxSize" value="20971520" />

如果所有验证都正确,则 MostrarResumenSubsanacion 的结果是下一个操作。

如果某些验证失败,则 MostrarRespuestaSubsanaciones 的结果是最后一个操作。

ErrorJakarta 的结果是解决问题的新行。

<action name="MostrarResumenSubsanacion" class="struts.expedientes.subsanaciones.MostrarResumenSubsanacion">
    <param name="conseguirConexion">SI</param>
    <param name="seguimiento">SI</param>
    <interceptor-ref name="interceptorFileStack"></interceptor-ref>
    <result name="MostrarRespuestaSubsanaciones" type="chain">MostrarRespuestaSubsanaciones</result>
    <result name="ErrorJakarta">/forms/struts/expedientes/subsanaciones/ventanaRespuestaSubsanacion.jsp</result>
    <result name="MostrarResumenSubsanacion">/forms/struts/expedientes/comun/ventanaResumen.jsp</result>
</action>


<action name="MostrarRespuestaSubsanaciones" class="struts.expedientes.subsanaciones.MostrarRespuestaSubsanaciones">
    <param name="conseguirConexion">SI</param>
    <param name="seguimiento">SI</param>
    <interceptor-ref name="interceptorBaseStack"></interceptor-ref>
    <result name="MostrarVentanaSubsanaciones">/forms/struts/expedientes/subsanaciones/ventanaRespuestaSubsanacion.jsp</result>
    <result name="input">/forms/struts/expedientes/subsanaciones/ventanaRespuestaSubsanacion.jsp</result>
</action>
  1. 不鼓励使用 Chain 结果类型;尝试使用 redirectAction(或 dispatcher)代替。

  2. Struts2中的每个请求:

    • 经过一堆拦截器,
    • 最终 达成行动,
    • 然后通过相同的拦截器堆栈向后过滤,运行行后的代码invocation.invoke();(如果有);
  3. 如果发生不好的事情(但可以恢复),an INPUT result is thrown;否则,如果发生非常糟糕的事情,则会抛出异常。

然后,如果您达到 20MB 的阈值,则会在某处返回 INPUT 结果,而不是正常的(错误的)链接过程。

通过查看两个拦截器堆栈的定义应该更容易破坏到底发生了什么,但是根据上述信息,您应该能够比更新问题更快地找到问题。