Die Erweiterung Struts2 .action führt zum Absturz von CSS, JavaScript und Struts Dojo

Wir haben einige Zeit auf Struts 2.1.8 gearbeitet und alle Struts-Aktionen haben wie erwartet funktioniert, d. H. Die Struts-Aktionen werden mit dem Aktionsnamen ohne Erweiterung gerendert.

Hier ist der JSP-Code, mit dem die Links eingerichtet wurden:

<ul id="top_menu">
  <li id="itemHome" class="active"><s:a action="viewHome">Home</s:a></li>
  <li><s:a action="viewSearch">Search</s:a></li>
  <li><s:a action="viewBookMarks">My Bookmarks</s:a></li>
  <li><s:a action="viewSupport">Support</s:a></li>
</ul>

Die Links werden richtig gerenderthttp://localhost/viewHome, http://localhost/viewSearchusw. unter 2.1.8

Wir haben gerade ein Upgrade auf Struts 2.2.1 durchgeführt (und haben alle Versionen von diesem auf v2.3.4.1 überprüft) und sehen nun, dass Struts-Aktionslinks wie folgt gerendert werdenhttp://localhost/viewHome.action, http://localhost/viewSearch.action, usw.

Meine Forschung hat gezeigt, dass die allgemein vorgeschlagene Lösung zu verwenden ist

<constant name="struts.action.extension" value=""/>

in struts.xml, um das Suffix .action zu entfernen. Dadurch werden die URLs zwar korrekt wiedergegeben, es wird jedoch ein unerwarteter Nebeneffekt verursacht. Struts glaubt jetzt, dass jede URL eine Aktion ist, einschließlich Anforderungen für CSS, PNG usw.

Meine Filterzuordnung in web.xml hat sich nicht geändert. Und obwohl es / * an Struts sendet, haben wir dieses Verhalten unter 2.1.8 nicht gesehen

<filter>
   <filter-name>struts2</filter-name>
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>   
</filter>

<filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Um dem entgegenzuwirken, musste ich das benutzenexcludePattern Struts zu stoppen versucht, diese Anforderungen als Aktionen zu behandeln.

<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>

Während dies funktioniert, besteht die letzte Hürde darin, dass meine Protokolle voller Fehler aus Struts-Tag-Anforderungen sind, die als Struts-Aktionen behandelt werden. Wenn ich diese URIs zum Ausschlussmuster hinzufüge, scheinen die Struts Dojo-Tags auf einigen Seiten nicht zu funktionieren.

Die betroffenen Teile von struts.xml sind:

<constant name="struts.devMode" value="true" />
<!-- Set URL's to have no .action extension -->
<constant name="struts.action.extension" value=""/>
<constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>

Ein Beispiel für die Struts-Fehler im Protokoll ist:

2012-09-26 17:12:57,984 [http-bio-8080-exec-9] ERROR org.apache.struts2.dispatcher.Dispatcher- Could not find action or result
/struts/dojo/struts_dojo.js
There is no Action mapped for namespace [/] and action name [struts_dojo.js] associated with context path []. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
    at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
    at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:501)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

Ich bin nicht sicher, ob es sich bei den Dojo-Anforderungen für die Streben um echte URIs oder virtuelle oder etwas anderes handelt.

An diesem Punkt habe ich einiges durchgespielt, um das im Wesentlichen einfache Problem zu beheben, die .action-Erweiterung von URLs zu entfernen, da das Zurückgehen auf die JAR-Version 2.1.8 alles löst, aber ich bin entschlossen zu finden ein Weg nach vorne, wenn möglich.

Jede Hilfe wird sehr geschätzt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage