Расширение Struts2 .action, вызывающее поломку CSS, JavaScript и Struts Dojo

Некоторое время мы работали на Struts 2.1.8, и все действия Struts работали должным образом, т. е. ссылки href на действия Struts отображаются с именем действия без расширения.

Вот код JSP, который устанавливает ссылки:

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

Ссылки отображаются правильно на http://localhost/viewHome, http://localhost/viewSearch и т. д. в версии 2.1.8.

Мы только что обновились до Struts 2.2.1 (проверили все версии от этой до v2.3.4.1) и теперь видим, что ссылки действий Struts отображаются как http://localhost/viewHome.action, http://localhost/viewSearch.action и т. д.

Мое исследование показало, что общее предлагаемое решение заключается в использовании

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

в struts.xml, чтобы удалить суффикс .action. Хотя это заставляет URL-адреса отображаться правильно, это вызывает неожиданный побочный эффект. Struts теперь считает каждый URL-адрес действием, включая запросы на .css, .png и т. д.

Мое сопоставление фильтров в web.xml не изменилось. И хотя он отправляет /* в Struts, мы не видели такого поведения в версии 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>

Чтобы противодействовать этому, мне пришлось использовать excludePattern, чтобы Struts не пытался обрабатывать эти запросы как действия.

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

Хотя это работает, последним препятствием является то, что мои журналы полны ошибок из запросов тегов Struts, которые обрабатываются как действия Struts. Когда я добавляю эти URI в шаблон исключения, теги Struts Dojo не работают на некоторых страницах.

Затронутые части 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/.*"/>

И пример ошибок Struts в журнале:

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)

Я не уверен, являются ли запросы Struts Dojo реальными URI, виртуальными или чем-то еще.

На данный момент мне кажется, что я перепрыгнул через несколько обручей, чтобы исправить то, что по сути является простой проблемой удаления расширения .action из URL-адреса, учитывая, что возвращение к JAR 2.1.8 решает все, но я полон решимости найти путь вперед, если это возможно.

Любая помощь очень ценится.


person Greg Kennedy    schedule 26.09.2012    source источник
comment
Хм, кажется, страница запрашивает библиотеку struts_dojo.js. Используете ли вы плагин dojo для Struts? Это устарело. Если нет, можете ли вы предоставить код, который запрашивает эту библиотеку?   -  person Jose L Martinez-Avial    schedule 27.09.2012


Ответы (1)


Попробуйте использовать расширение действия struts с такой запятой
<constant name="struts.action.extension" value=","/>.
Из файла свойств struts2:

Используется DefaultActionMapper. Вы можете указать список, разделенный запятыми, например. struts.action.extension=action,jnlp,do Пустое расширение позволяет вам сопоставлять списки каталогов, а также чистые имена действий, не мешая статическим ресурсам, которые можно указать в виде пустой строки перед запятой, например. struts.action.extension= или struts.action.extension=x,y,z,, struts.action.extension=action,,

person Aleksandr M    schedule 27.09.2012
comment
Это сработало. Спасибо Александр. Как только я добавил запятую, строка стала выглядеть так: <constant name="struts.action.extension" value=","/> все вернулось к поведению до 2.2.1. Мне также не нужно было явно исключать статический контент с помощью <constant name="struts.action.excludePattern" value="/index.html,/images/.*,/js/.*,/css/.*"/>, и я также смог удалить его. - person Greg Kennedy; 28.09.2012
comment
Это также помогает установить name="struts.action.extension" value=",action", чтобы работало как .action, так и отсутствие суффикса. - person Akku; 20.05.2013
comment
Я не уверен, что эта проблема все еще существует в 2.3.16; кто-нибудь может подтвердить? - person Andrea Ligios; 28.02.2014
comment
@AndreaLigios: Struts2 v. 2.3.16 пустое значение для константы расширения не работает. - person Aleksandr M; 28.02.2014
comment
В порядке. Я использовал его с регулярным выражением patternMatcher и расширенными сопоставлениями подстановочных знаков, и он работал нормально. Теперь изменено на , и оно работает одинаково ... но все мои статические разрешения являются внешними, так что, возможно, это так. - person Andrea Ligios; 28.02.2014
comment
Я попробовал это сейчас в проекте с patterMatcher по умолчанию, и он работает как шарм, а сломается как черт :) Хороший улов !! - person Andrea Ligios; 11.03.2014
comment
Начиная с версии 2.3.24 -- установка struts.action.extension= без значения просто работает. Наличие , не работает. - person asyncwait; 23.05.2015
comment
@asyncwait: Нет, вы ошибаетесь. Взгляните на DefaultActionMapper, то же, что и раньше. Вероятно, у вас есть какая-то другая конфигурация, которая мешает расширению. См. также WW-4418. - person Aleksandr M; 25.05.2015