将 WebSocket API 与 Struts 2 结合使用

问题描述 投票:0回答:1

我有一个在 Tomcat 7.0.43 上运行的 Struts2 Web 应用程序,它使用 Rest 和 Convention 插件来映射所有请求。 Struts 尝试自行映射所有请求。

JSR 356 使用注释定义服务器端点,例如

@ServerEndpoint(value = "/websocket/chat")

现在,当浏览器尝试连接到

ws:/127.0.0.1:8080/websocket/chat
时,请求会失败,因为 Struts 映射器拦截了请求。

我可以在 XML 文件中指定任何内容,以便请求到达正确的位置吗?

编辑:

按照建议,我添加了

<constant name="struts.action.excludePattern" value="/websocket.*?" />

我的 Struts 配置,之后 URL /websocket/chat 开始出现 404 错误。

后来我了解到我需要配置一个

ServerApplicationConfig
实现。完成此操作后,Websocket 开始正常工作,但我的应用程序的其余部分无法加载并出现错误:

SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

这是我的课:

public class Socket implements ServerApplicationConfig {

    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scanned) {

        Set<ServerEndpointConfig> result = new HashSet<ServerEndpointConfig>();

        return result;
    }

    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {

        Set<Class<?>> results = new HashSet<Class<?>>();
        for (Class<?> clazz : scanned) {
            results.add(clazz);
        }
        return results;
    }
}

我怎样才能让一切和谐地协同工作?

注意:我正在使用 Struts Spring 插件进行 Spring Security 的依赖注入。

java spring struts2 websocket tomcat7
1个回答
6
投票

您可以配置 Struts 过滤器以通过正则表达式模式排除某些 URL。您应该在

struts.xml

中添加常量
<constant name="struts.action.excludePattern" value="^ws://.+$"/>

使用 Websocket API 作为服务器端点。

© www.soinside.com 2019 - 2024. All rights reserved.