Rozszerzenie działania Struts2 powodujące przerwanie CSS, JavaScript i Struts Dojo

Przez pewien czas działaliśmy na Struts 2.1.8 i wszystkie akcje Struts działały zgodnie z oczekiwaniami, tj. Href do akcji Struts są renderowane z nazwą akcji bez rozszerzenia.

Oto kod JSP, który ustawia linki:

<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>

Linki wyświetlane poprawniehttp://localhost/viewHome, http://localhost/viewSearch, itp. zgodnie z 2.1.8

Właśnie uaktualniliśmy do Struts 2.2.1 (sprawdziliśmy wszystkie wersje od tego do v2.3.4.1) i teraz widzimy, że linki akcji Struts są renderowane jakohttp://localhost/viewHome.action, http://localhost/viewSearch.actionitd.

Moje badania wykazały, że ogólne sugerowane rozwiązanie polega na użyciu

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

w struts.xml, aby usunąć przyrostek .action. Chociaż powoduje to, że adresy URL są renderowane poprawnie, powoduje nieoczekiwany efekt uboczny. Struts uważa teraz, że każdy URL jest akcją zawierającą żądania .css, .png itp.

Moje mapowanie filtrów w pliku web.xml nie uległo zmianie. I chociaż wysyła / * do Struts, nie widzieliśmy tego zachowania w 2.1.8

<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>

Aby temu przeciwdziałać, musiałem użyćexcludePattern zatrzymać Struts, próbując traktować te żądania jako działania.

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

Podczas gdy to działa, ostatnią przeszkodą jest to, że moje dzienniki są pełne błędów z żądań znaczników Struts, które są obsługiwane jako działania Struts. Gdy dodaję te URI do wzorca wykluczeń, tagi Dojuts Struts nie działają na niektórych stronach.

Dotyczy to części struts.xml:

<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/.*"/>

Przykładem błędów Struts w dzienniku jest:

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)

Nie jestem pewien, czy żądania Dojo w struts są rzeczywistymi identyfikatorami URI, czy wirtualnymi lub czymś innym.

W tym momencie wydaje mi się, że przeskoczyłem kilka obręczy, aby naprawić to, co jest zasadniczo prostym problemem usunięcia rozszerzenia .action z adresu URL, ponieważ powrót do JAR 2.1.8 rozwiązuje wszystko, ale jestem zdeterminowany, aby znaleźć droga do przodu, jeśli to możliwe.

Wszelaka pomoc jest bardzo doceniana.

questionAnswers(1)

yourAnswerToTheQuestion