Struts2的.action扩展导致CSS,JavaScript和Struts的道场打破(Stru

2019-06-18 08:20发布

我们已经进行了一段时间的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/viewHomehttp://localhost/viewSearch等2.1.8下

我们刚刚升级到2.2.1的Struts(一个已检查从这个高达v2.3.4.1所有版本)和现在看到的Struts动作链接被渲染为http://localhost/viewHome.actionhttp://localhost/viewSearch.action等。

我的研究表明,一般建议的解决方案是使用

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

在struts.xml中删除.action后缀。 虽然这使得网址正确渲染它是导致意想不到的副作用。 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的标签道场似乎并不在一些网页是工作。

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)

我不知道,如果支柱道场请求是真实的URI或虚拟或别的东西。

这种感觉在这一点上,我已经经历了不少篮球跃升到解决什么本质上是去除的URL的.action扩展因为要回2.1.8 JAR解决一切,但我决心要找到一个简单的问题向前如果可能的途径。

很感谢任何形式的帮助。

Answer 1:

尝试使用Struts动作exstension像这样的逗号
<constant name="struts.action.extension" value=","/>
从Struts2的属性文件:

由DefaultActionMapper使用时,可以提供一个逗号分隔的列表,如struts.action.extension =行动,JNLP,做的空白扩展允许您匹配的目录列表,以及纯粹的动作名称,而不使用静态资源,可以被指定为干扰一个空字符串之前的逗号例如struts.action.extension =,或struts.action.extension = X,Y,Z ,, struts.action.extension =动作,,



文章来源: Struts2 .action extension causing CSS, JavaScript and Struts Dojo to break