WebSocketサポートのフレームワークとしてAtmosphereを使用するチャットサーバーを実行しています。大気はジャージーを使用しています。Atmosphere + Tomcat 8と非大気クライアントのジャージエラー
チャットサーバにTomcat 7上で動作し、我々はTomcatの8に私たちのクライアントの
つをアップグレードするには、自分のJavaのWebSocket APIとしてタイラスを使用しています。
私たちのチャットサーバーがTomcat 7(Java 6,7、または8)にデプロイされている場合、問題はありません。
Tomcat 8(Java 8)のチャットサーバーでは、Atmosphereを使用するテストクライアントは正常に動作しますが、Tyrusを使用するクライアントは正常に動作しません。私たちが見るのエラーがある:
2017-01-17 02:36:51,114 ERROR() [http-nio-8443-exec-11] ReflectorServletProcessor (?) - onRequest()
java.lang.IllegalArgumentException: Schema specific part is opaque
at com.sun.jersey.api.uri.UriBuilderImpl.checkSsp(UriBuilderImpl.java:529)
at com.sun.jersey.api.uri.UriBuilderImpl.replacePath(UriBuilderImpl.java:256)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:703)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.atmosphere.util.AtmosphereFilterChain.doFilter(AtmosphereFilterChain.java:135)
at org.atmosphere.util.AtmosphereFilterChain.invokeFilterChain(AtmosphereFilterChain.java:96)
at org.atmosphere.handler.ReflectorServletProcessor$FilterChainServletWrapper.service(ReflectorServletProcessor.java:317)
at org.atmosphere.handler.ReflectorServletProcessor.onRequest(ReflectorServletProcessor.java:160)
at org.atmosphere.cpr.AsynchronousProcessor.action(AsynchronousProcessor.java:199)
at org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProcessor.java:107)
at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:66)
at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:2078)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:571)
at org.atmosphere.websocket.DefaultWebSocketProcessor$3.run(DefaultWebSocketProcessor.java:333)
at org.atmosphere.util.VoidExecutorService.execute(VoidExecutorService.java:101)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:328)
at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:525)
at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:428)
at org.atmosphere.container.JSR356Endpoint$1.onMessage(JSR356Endpoint.java:213)
at org.atmosphere.container.JSR356Endpoint$1.onMessage(JSR356Endpoint.java:210)
at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:393)
at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:494)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:289)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:130)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:60)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:183)
at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:198)
at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:96)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:669)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
のTomcat 7で、WebSocketの要求からのリクエストURLをするために同様と見られているので、これが発生する「にhttp:// localhost:8080//チャット」(要求が行われますws:// localhost:8080/chat /に変更されていますが、http:// somewhereに変更されています)。しかしTomcat 8では、websocketリクエストからのリクエストURLは "/ chat /"に似ていて、スキーマは存在せず、Jerseyはエラーを投げます。
これと対処するために、Atmosphereは、Atmosphereクライアントが要求を出したときにスキーマを持つヘッダ "origin"を探します。しかしTyrusクライアントがリクエストを行うと、その "origin"ヘッダーには上記のエラーが発生したHTTPスキーマは含まれません。
誰かがこれに対する簡単な解決策を考えているのか、同様の問題を抱えているのか疑問に思っています。私はシンプルなソリューションを探していましたが、まだ見つけられていません。 1つもなければ、Atmosphereの使用をやめ、コードリファクタリングの多くを使用しなければならないことに目を向けています。
これは、この問題を回避するためのチケット/バグへのリンクですが、私は正しいバージョンを持っていてまだ問題があります。
https://bz.apache.org/bugzilla/show_bug.cgi?id=56573 は大気バージョンhttps://github.com/Atmosphere/atmosphere/issues/1839
:バージョン1.19
ツロ:(大気を介して)
ジャージーバージョン
2.4.8これを回避するには、「変更するために1.13