From b83dd6e0540bb3a4e007af4206c615a5dde58080 Mon Sep 17 00:00:00 2001 From: xhf Date: Tue, 28 Nov 2017 21:35:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9websocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/jboot/server/JbootServerConfig.java | 9 -------- .../jboot/server/undertow/UnderTowServer.java | 23 ++++++++++--------- .../io/jboot/web/handler/JbootHandler.java | 3 ++- .../web/websocket/JbootWebsocketManager.java | 22 ++++++++++++++++++ 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/main/java/io/jboot/server/JbootServerConfig.java b/src/main/java/io/jboot/server/JbootServerConfig.java index 5694249d..9d16af07 100644 --- a/src/main/java/io/jboot/server/JbootServerConfig.java +++ b/src/main/java/io/jboot/server/JbootServerConfig.java @@ -31,7 +31,6 @@ public class JbootServerConfig { private String contextPath = "/"; private boolean websocketEnable = false; private int websocketBufferPoolSize = 100; - private String websocketEndpoint; public String getType() { @@ -82,14 +81,6 @@ public class JbootServerConfig { this.websocketBufferPoolSize = websocketBufferPoolSize; } - public String getWebsocketEndpoint() { - return websocketEndpoint; - } - - public void setWebsocketEndpoint(String websocketEndpoint) { - this.websocketEndpoint = websocketEndpoint; - } - @Override public String toString() { return "JbootServerConfig {" + diff --git a/src/main/java/io/jboot/server/undertow/UnderTowServer.java b/src/main/java/io/jboot/server/undertow/UnderTowServer.java index 5df29181..4949daa4 100644 --- a/src/main/java/io/jboot/server/undertow/UnderTowServer.java +++ b/src/main/java/io/jboot/server/undertow/UnderTowServer.java @@ -32,6 +32,7 @@ import io.jboot.server.ContextListeners; import io.jboot.server.JbootServer; import io.jboot.server.JbootServerConfig; import io.jboot.server.listener.JbootAppListenerManager; +import io.jboot.utils.ClassScanner; import io.jboot.utils.StringUtils; import io.undertow.Handlers; import io.undertow.Undertow; @@ -50,9 +51,11 @@ import org.apache.shiro.web.servlet.ShiroFilter; import javax.servlet.DispatcherType; import javax.servlet.ServletContextListener; +import javax.websocket.server.ServerEndpoint; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Map; @@ -85,20 +88,18 @@ public class UnderTowServer extends JbootServer { deploymentInfo = buildDeploymentInfo(classloader); if (config.isWebsocketEnable()) { - if (StringUtils.isBlank(config.getWebsocketEndpoint())) { - throw new JbootException("websocket endpoint is null,please config jboot.server.websocketEndpoint in your properties."); - } - - try { - deploymentInfo.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, - new WebSocketDeploymentInfo() - .setBuffers(new DefaultByteBufferPool(true, config.getWebsocketBufferPoolSize())) - .addEndpoint(Class.forName(config.getWebsocketEndpoint()))); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + List endPointClasses = ClassScanner.scanClassByAnnotation(ServerEndpoint.class, false); + if (endPointClasses != null && endPointClasses.size() != 0) { + WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo(); + for (Class entry : endPointClasses) { + webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, config.getWebsocketBufferPoolSize())); + webSocketDeploymentInfo.addEndpoint(entry); + } + deploymentInfo.addServletContextAttribute(WebSocketDeploymentInfo.ATTRIBUTE_NAME, webSocketDeploymentInfo); } } + servletContainer = Servlets.newContainer(); deploymentManager = servletContainer.addDeployment(deploymentInfo); deploymentManager.deploy(); diff --git a/src/main/java/io/jboot/web/handler/JbootHandler.java b/src/main/java/io/jboot/web/handler/JbootHandler.java index 297a9bc0..23b11615 100644 --- a/src/main/java/io/jboot/web/handler/JbootHandler.java +++ b/src/main/java/io/jboot/web/handler/JbootHandler.java @@ -20,6 +20,7 @@ import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; import io.jboot.exception.JbootExceptionHolder; import io.jboot.web.JbootRequestContext; import io.jboot.web.session.JbootServletRequestWrapper; +import io.jboot.web.websocket.JbootWebsocketManager; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -30,7 +31,7 @@ public class JbootHandler extends Handler { @Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { - if (target.indexOf('.') != -1) { + if (target.indexOf('.') != -1 || JbootWebsocketManager.me().containsEndPoint(target)) { return; } diff --git a/src/main/java/io/jboot/web/websocket/JbootWebsocketManager.java b/src/main/java/io/jboot/web/websocket/JbootWebsocketManager.java index 5dff8a34..594468cd 100644 --- a/src/main/java/io/jboot/web/websocket/JbootWebsocketManager.java +++ b/src/main/java/io/jboot/web/websocket/JbootWebsocketManager.java @@ -16,15 +16,37 @@ package io.jboot.web.websocket; import io.jboot.utils.ClassNewer; +import io.jboot.utils.ClassScanner; +import io.jboot.utils.StringUtils; + +import javax.websocket.server.ServerEndpoint; +import java.util.*; public class JbootWebsocketManager { private static JbootWebsocketManager manager; + private static Vector serverEndPointValues = new Vector();; public static JbootWebsocketManager me() { if (manager == null) { + List endPointClasses = ClassScanner.scanClassByAnnotation(ServerEndpoint.class, false); + if (endPointClasses != null && endPointClasses.size() != 0) { + for (Class entry : endPointClasses) { + ServerEndpoint serverEndpoint = (ServerEndpoint) entry.getAnnotation(ServerEndpoint.class); + String value = serverEndpoint.value(); + if (!StringUtils.isBlank(value)) { + serverEndPointValues.add(value); + } + } + } + manager = ClassNewer.singleton(JbootWebsocketManager.class); } return manager; } + + public boolean containsEndPoint(String endPointValue) { + return serverEndPointValues.contains(endPointValue); + } + } -- Gitee