Java 在建立之前防止websocket连接

Java 在建立之前防止websocket连接,java,embedded-jetty,jetty-9,java-websocket,Java,Embedded Jetty,Jetty 9,Java Websocket,我们的应用程序在嵌入式码头中使用WebSocket。客户端传递一个包含id的http头。如果已经连接了具有相同id的客户端,则我们试图阻止连接。不,我们这里不是在讨论用户身份验证 我们目前知道的唯一方法是在端点的@OnOpen回调中实现此检查。问题是这个方法只有在连接建立之后才会被调用。因此,第二个客户端的连接状态正在切换 相反,我们希望在建立连接之前执行检查。我们曾考虑使用ServletFilter,但根据另一位用户的回答,websocket通信不支持ServletFilter 服务器是否有办

我们的应用程序在嵌入式码头中使用WebSocket。客户端传递一个包含id的http头。如果已经连接了具有相同id的客户端,则我们试图阻止连接。不,我们这里不是在讨论用户身份验证

我们目前知道的唯一方法是在端点的@OnOpen回调中实现此检查。问题是这个方法只有在连接建立之后才会被调用。因此,第二个客户端的连接状态正在切换

相反,我们希望在建立连接之前执行检查。我们曾考虑使用ServletFilter,但根据另一位用户的回答,websocket通信不支持ServletFilter


服务器是否有办法防止基于任意条件建立websocket连接?

因此,正确的方法似乎是在自定义配置器类中引发RuntimeException。至少在码头示例中是这样做的:

这仍然不是一个完美的解决方案,因为无法发送自定义http状态或websocket关闭代码。在客户端,这将导致通用堆栈跟踪:

java.io.IOException: Connect failure
    at org.eclipse.jetty.websocket.jsr356.ClientContainer.connect(ClientContainer.java:157)
    at org.eclipse.jetty.websocket.jsr356.ClientContainer.connectToServer(ClientContainer.java:180)
    at kam.cpush.ClientTestEndPoint.connect(ClientTestEndPoint.java:169)
    at kam.cpush.ClientTestEndPoint.connect(ClientTestEndPoint.java:155)
    at kam.cproxy.integrationtest.DuplicateControlChannelIT.connectToProxy(DuplicateControlChannelIT.java:72)
    at kam.cproxy.integrationtest.DuplicateControlChannelIT.testDuplicateChannelNotAllowed(DuplicateControlChannelIT.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:205)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:108)
    at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.validateResponse(UpgradeConnection.java:314)
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.read(UpgradeConnection.java:241)
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.onFillable(UpgradeConnection.java:163)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)

因此,正确的方法似乎是在自定义配置器类中抛出RuntimeException。至少在码头示例中是这样做的:

这仍然不是一个完美的解决方案,因为无法发送自定义http状态或websocket关闭代码。在客户端,这将导致通用堆栈跟踪:

java.io.IOException: Connect failure
    at org.eclipse.jetty.websocket.jsr356.ClientContainer.connect(ClientContainer.java:157)
    at org.eclipse.jetty.websocket.jsr356.ClientContainer.connectToServer(ClientContainer.java:180)
    at kam.cpush.ClientTestEndPoint.connect(ClientTestEndPoint.java:169)
    at kam.cpush.ClientTestEndPoint.connect(ClientTestEndPoint.java:155)
    at kam.cproxy.integrationtest.DuplicateControlChannelIT.connectToProxy(DuplicateControlChannelIT.java:72)
    at kam.cproxy.integrationtest.DuplicateControlChannelIT.testDuplicateChannelNotAllowed(DuplicateControlChannelIT.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:205)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:108)
    at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: org.eclipse.jetty.websocket.api.UpgradeException: Didn't switch protocols
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.validateResponse(UpgradeConnection.java:314)
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.read(UpgradeConnection.java:241)
    at org.eclipse.jetty.websocket.client.io.UpgradeConnection.onFillable(UpgradeConnection.java:163)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)

这是过于简单的JSR-356(
javax.websocket
)API的错误,而不是Jetty。如果您使用本机Jetty WebSocket API,您可以在自己的自定义
WebSocketCreator
实现中返回HTTP状态代码等等。这是过于简单的JSR-356(
javax.WebSocket
)API的错误,而不是Jetty。如果您使用本机Jetty WebSocket API,您可以在自己的自定义
WebSocketCreator
实现中返回HTTP状态码等等。我很想知道4年后是否有变化?我也有同样的问题,我真的很想知道4年后是否有什么变化?我有同样的问题