1

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

当业务逻辑失败时,项目有链式重定向,它返回到最后一个 JSP(最后一个动作),成功地重新加载所有页面而无需编程工作(它也重新加载旧请求)。

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

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

result = invocation.invoke();

当 Jakarta 强制链重定向时,拦截器会捕获这个新请求,但不会通过调用方法到达动作

我不知道为什么会这样。当相同的动作强制进行相同的链重定向时,因为其他验证(如 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>
4

1 回答 1

1
  1. 不鼓励使用Chain结果类型;尝试使用redirectAction(或dispatcher)代替。

  2. Struts2 中的每个请求:

    • 通过一堆拦截器,
    • 最终达到Action,
    • 然后通过相同的拦截器堆栈向后过滤,在该行之后运行代码invocation.invoke();(如果有);
  3. 如果发生了不好(但可以恢复)的事情,则会抛出一个INPUT结果;否则,如果发生非常糟糕的事情,则会引发异常。

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

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

于 2016-01-18T11:33:50.963 回答