Struts2 和 Comet url 模式冲突

Struts2 and Comet url pattern conflict

我正在尝试将 comet chat 集成到我的 struts2+hibernate 应用程序中。首先,我在单独的 web 应用程序中测试了 comet chat。它工作正常。我从 http://skillshared.blogspot.in/2012/10/facebook-similar-chat-for-your-java-web.html 下载它,然后我尝试在我的应用程序

中实现

我在 web.xml 中的问题是我的 web.xml 文件

<context-param>
    <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
    <param-value>/WEB-INF/tiles.xml</param-value>
</context-param>

<listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>
<display-name>Cometd Test WebApp</display-name>


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

 </filter>

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

<!-- Portability Filter, needed only to run on non Jetty 
     or non Servlet-3.0 containers like Tomcat-->

<filter>
    <filter-name>continuation</filter-name>
    <filter-class>org.eclipse.jetty.continuation.ContinuationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>continuation</filter-name>
    <url-pattern>/cometd/*</url-pattern>


</filter-mapping>

<!-- Cometd Servlet -->
<servlet>
    <servlet-name>cometd</servlet-name>
    <servlet-class>org.cometd.annotation.AnnotationCometdServlet</servlet-class>
    <init-param>
        <param-name>timeout</param-name>
        <param-value>20000</param-value>
    </init-param>
    <init-param>
        <param-name>interval</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>maxInterval</param-name>
        <param-value>10000</param-value>
    </init-param>
    <init-param>
        <param-name>maxLazyTimeout</param-name>
        <param-value>5000</param-value>
    </init-param>
    <init-param>
        <param-name>long-polling.multiSessionInterval</param-name>
        <param-value>2000</param-value>
    </init-param>
    <init-param>
        <param-name>logLevel</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>transports</param-name>
        <param-value>org.cometd.websocket.server.WebSocketTransport</param-value>
    </init-param>
    <init-param>
        <param-name>services</param-name>
        <param-value>com.semika.cometd.ChatService</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>cometd</servlet-name>
    <url-pattern>/cometd/*</url-pattern>
</servlet-mapping>
 <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

上面的代码应用程序工作正常但聊天不工作。我看到了很多关于这个问题的帖子,我有一个解决方案

<URL-pattern>*.action</URL-pattern>

当我尝试进行此聊天时,它工作正常,但应用程序不工作。当我只有 place 应用程序工作时。

<url-pattern>/*</url-pattern> 

我也在 struts.xml 中尝试过这个,但没有用。

<constant name="struts.action.excludePattern" value="/cometd/*,/cometd/.*"/>

问题的原因可能是什么?

整个事情取决于您的 Struts 版本。如果您有旧版本,出​​于多种原因,尤其是安全修复,您应该迁移到新版本。

但是,考虑到:

  • 随着 Struts >= 2.1.3FilterDispatcher 已弃用,新的​​ StrutsPrepareAndExecuteFilter 必须使用。 Read more

  • Struts <= 2.1.6struts.action.excludePattern 不存在。 Read more

你的代码不可能工作;)