我使用chrome,它总是返回:
WebSocket connection to 'ws://192.168.1.228:9090/achat/cometd' failed: Unexpected response code: 400
发生此错误后,它使用长轮询传输,并成功连接到服务器。
如何让WebSocket工作?它是由使用SpringFramework 3.1引起的吗?感谢。
Web.xml中
<!-- Filter to support cross domain requests -->
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
<!--async-supported>true</async-supported-->
</filter>
<filter-mapping>
<filter-name>cross-origin</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>
<!--async-supported>true</async-supported-->
<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>100</param-value>
</init-param>
<init-param>
<param-name>transports</param-name>
<param-value>org.cometd.websocket.server.WebSocketTransport</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>
的Servlet
@Named
@Singleton
@Service
public class ChatService {
@Inject
private BayeuxServer bayeux;
@Session
private ServerSession serverSession;
@Listener("/chat")
public void processHello(ServerSession remote, ServerMessage.Mutable message)
{
Map<String, Object> input = message.getDataAsMap();
String room = input.get("room").toString();
String content = input.get("content").toString();
Map<String, Object> output = input;
bayeux.getChannel("/room/" + room).publish(remote, output, null);
}
}
答案 0 :(得分:0)
关注CometD Reference Manual,特别是解释如何整合CometD with Spring的部分。
在那里你可以找到一个使用Spring的XML配置来设置WebSocket的例子,以及一个如何通过注释配置Spring的例子。
您的问题缺少Spring配置文件和web.xml
文件的一部分,因此很难以更详细的方式帮助您。
请记住,如果在Spring中配置CometD,则必须从web.xml
中删除所有CometD配置。您必须只有一个配置事物的地方:web.xml
或Spring的XML /注释。