|
|
@@ -6,13 +6,22 @@ import cn.hutool.core.thread.GlobalThreadPool;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.http.server.action.Action;
|
|
|
import cn.hutool.http.server.action.RootAction;
|
|
|
+import cn.hutool.http.server.filter.HttpFilter;
|
|
|
+import cn.hutool.http.server.filter.SimpleFilter;
|
|
|
import cn.hutool.http.server.handler.ActionHandler;
|
|
|
+import com.sun.net.httpserver.Filter;
|
|
|
+import com.sun.net.httpserver.HttpContext;
|
|
|
+import com.sun.net.httpserver.HttpExchange;
|
|
|
import com.sun.net.httpserver.HttpHandler;
|
|
|
import com.sun.net.httpserver.HttpServer;
|
|
|
+import com.sun.net.httpserver.HttpsConfigurator;
|
|
|
+import com.sun.net.httpserver.HttpsServer;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.net.InetSocketAddress;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
import java.util.concurrent.Executor;
|
|
|
|
|
|
/**
|
|
|
@@ -23,7 +32,8 @@ import java.util.concurrent.Executor;
|
|
|
*/
|
|
|
public class SimpleServer {
|
|
|
|
|
|
- HttpServer server;
|
|
|
+ private final HttpServer server;
|
|
|
+ private final List<Filter> filters;
|
|
|
|
|
|
/**
|
|
|
* 构造
|
|
|
@@ -50,26 +60,105 @@ public class SimpleServer {
|
|
|
* @param address 监听地址
|
|
|
*/
|
|
|
public SimpleServer(InetSocketAddress address) {
|
|
|
+ this(address, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构造
|
|
|
+ *
|
|
|
+ * @param address 监听地址
|
|
|
+ * @param configurator https配置信息,用于使用自定义SSL(TLS)证书等
|
|
|
+ */
|
|
|
+ public SimpleServer(InetSocketAddress address, HttpsConfigurator configurator) {
|
|
|
try {
|
|
|
- this.server = HttpServer.create(address, 0);
|
|
|
+ if(null != configurator){
|
|
|
+ final HttpsServer server = HttpsServer.create(address, 0);
|
|
|
+ server.setHttpsConfigurator(configurator);
|
|
|
+ this.server = server;
|
|
|
+ } else{
|
|
|
+ this.server = HttpServer.create(address, 0);
|
|
|
+ }
|
|
|
} catch (IOException e) {
|
|
|
throw new IORuntimeException(e);
|
|
|
}
|
|
|
setExecutor(GlobalThreadPool.getExecutor());
|
|
|
+ filters = new ArrayList<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 增加请求过滤器,此过滤器对所有请求有效<br>
|
|
|
+ * 此方法需在以下方法前之前调用:
|
|
|
+ *
|
|
|
+ * <ul>
|
|
|
+ * <li>{@link #setRoot(File)} </li>
|
|
|
+ * <li>{@link #setRoot(String)} </li>
|
|
|
+ * <li>{@link #createContext(String, HttpHandler)} </li>
|
|
|
+ * <li>{@link #addHandler(String, HttpHandler)}</li>
|
|
|
+ * <li>{@link #addAction(String, Action)} </li>
|
|
|
+ * </ul>
|
|
|
+ *
|
|
|
+ * @param filter {@link Filter} 请求过滤器
|
|
|
+ * @return this
|
|
|
+ * @since 5.5.7
|
|
|
+ */
|
|
|
+ public SimpleServer addFilter(Filter filter) {
|
|
|
+ this.filters.add(filter);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 增加请求过滤器,此过滤器对所有请求有效<br>
|
|
|
+ * 此方法需在以下方法前之前调用:
|
|
|
+ *
|
|
|
+ * <ul>
|
|
|
+ * <li>{@link #setRoot(File)} </li>
|
|
|
+ * <li>{@link #setRoot(String)} </li>
|
|
|
+ * <li>{@link #createContext(String, HttpHandler)} </li>
|
|
|
+ * <li>{@link #addHandler(String, HttpHandler)}</li>
|
|
|
+ * <li>{@link #addAction(String, Action)} </li>
|
|
|
+ * </ul>
|
|
|
+ *
|
|
|
+ * @param filter {@link Filter} 请求过滤器
|
|
|
+ * @return this
|
|
|
+ * @since 5.5.7
|
|
|
+ */
|
|
|
+ public SimpleServer addFilter(HttpFilter filter) {
|
|
|
+ return addFilter(new SimpleFilter() {
|
|
|
+ @Override
|
|
|
+ public void doFilter(HttpExchange httpExchange, Chain chain) throws IOException {
|
|
|
+ filter.doFilter(new HttpServerRequest(httpExchange), new HttpServerResponse(httpExchange), chain);
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 增加请求处理规则
|
|
|
*
|
|
|
- * @param path 路径
|
|
|
- * @param handler 处理器
|
|
|
+ * @param path 路径,例如:/a/b 或者 a/b
|
|
|
+ * @param handler 处理器,包括请求和响应处理
|
|
|
* @return this
|
|
|
+ * @see #createContext(String, HttpHandler)
|
|
|
*/
|
|
|
public SimpleServer addHandler(String path, HttpHandler handler) {
|
|
|
+ createContext(path, handler);
|
|
|
+ return this;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建请求映射上下文,创建后,用户访问指定路径可使用{@link HttpHandler} 中的规则进行处理
|
|
|
+ *
|
|
|
+ * @param path 路径,例如:/a/b 或者 a/b
|
|
|
+ * @param handler 处理器,包括请求和响应处理
|
|
|
+ * @return {@link HttpContext}
|
|
|
+ * @since 5.5.7
|
|
|
+ */
|
|
|
+ public HttpContext createContext(String path, HttpHandler handler) {
|
|
|
// 非/开头的路径会报错
|
|
|
path = StrUtil.addPrefixIfNot(path, StrUtil.SLASH);
|
|
|
- this.server.createContext(path, handler);
|
|
|
- return this;
|
|
|
+ final HttpContext context = this.server.createContext(path, handler);
|
|
|
+ // 增加整体过滤器
|
|
|
+ context.getFilters().addAll(this.filters);
|
|
|
+ return context;
|
|
|
}
|
|
|
|
|
|
/**
|