Skip to content

Commit 79d8aa0

Browse files
committed
蓝奏云规则微调, 框架优化(70%)
1 parent a724d70 commit 79d8aa0

File tree

17 files changed

+213
-57
lines changed

17 files changed

+213
-57
lines changed

core/src/main/java/cn/qaiu/vx/core/Deploy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ private void outLogo(JsonObject conf) {
8282
var calendar = Calendar.getInstance();
8383
calendar.setTime(new Date());
8484
var year = calendar.get(Calendar.YEAR);
85-
var logoTemplete = """
85+
var logoTemplate = """
8686
8787
Web Server powered by:\s
8888
____ ____ _ _ _ \s
@@ -95,7 +95,7 @@ private void outLogo(JsonObject conf) {
9595
9696
""";
9797

98-
System.out.printf(logoTemplete,
98+
System.out.printf(logoTemplate,
9999
conf.getString("version_app"),
100100
VersionCommand.getVersion(),
101101
conf.getString("copyright"),
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cn.qaiu.vx.core.annotaions;
2+
3+
import java.lang.annotation.*;
4+
5+
@Documented
6+
@Inherited
7+
@Target(ElementType.TYPE)
8+
@Retention(RetentionPolicy.RUNTIME)
9+
public @interface HandleSortFilter {
10+
/**
11+
* 注册顺序,数字越大越先注册<br>
12+
* 值<0时会过滤掉该处理器
13+
*/
14+
int value() default 0;
15+
}

core/src/main/java/cn/qaiu/vx/core/base/BaseHttpApi.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package cn.qaiu.vx.core.base;
22

3+
import cn.qaiu.vx.core.interceptor.AfterInterceptor;
34
import io.vertx.core.json.JsonObject;
45
import io.vertx.ext.web.RoutingContext;
56

7+
import java.util.Set;
8+
69
import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE;
710

811
/**
@@ -13,6 +16,10 @@
1316
*/
1417
public interface BaseHttpApi {
1518

19+
default Set<AfterInterceptor> getAfterInterceptor() {
20+
return null;
21+
}
22+
1623
default void fireJsonResponse(RoutingContext ctx, JsonObject jsonResult) {
1724
ctx.response().putHeader(CONTENT_TYPE, "application/json; charset=utf-8")
1825
.setStatusCode(200)
@@ -21,11 +28,28 @@ default void fireJsonResponse(RoutingContext ctx, JsonObject jsonResult) {
2128

2229
default <T> void fireJsonResponse(RoutingContext ctx, T jsonResult) {
2330
JsonObject jsonObject = JsonObject.mapFrom(jsonResult);
24-
fireJsonResponse(ctx, jsonObject);
31+
if (!ctx.response().ended()) {
32+
fireJsonResponse(ctx, jsonObject);
33+
}
34+
handleAfterInterceptor(ctx, jsonObject);
35+
}
36+
37+
default void handleAfterInterceptor(RoutingContext ctx, JsonObject jsonObject){
38+
Set<AfterInterceptor> afterInterceptor = getAfterInterceptor();
39+
if (afterInterceptor != null) {
40+
afterInterceptor.forEach(ai -> ai.handle(ctx.request(), jsonObject));
41+
}
42+
if (!ctx.response().ended()) {
43+
fireJsonResponse(ctx, "handleAfterInterceptor end.");
44+
}
2545
}
2646

2747
default void fireTextResponse(RoutingContext ctx, String text) {
28-
ctx.response().putHeader("content-type", "text/html; charset=utf-8").end(text);
48+
ctx.response().putHeader(CONTENT_TYPE, "text/html; charset=utf-8").end(text);
49+
Set<AfterInterceptor> afterInterceptor = getAfterInterceptor();
50+
if (afterInterceptor != null) {
51+
afterInterceptor.forEach(ai -> ai.handle(ctx.request(), new JsonObject().put("text", text)));
52+
}
2953
}
3054

3155
default void sendError(int statusCode, RoutingContext ctx) {

core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package cn.qaiu.vx.core.handlerfactory;
22

3-
import cn.qaiu.vx.core.annotaions.DateFormat;
4-
import cn.qaiu.vx.core.annotaions.RouteHandler;
5-
import cn.qaiu.vx.core.annotaions.RouteMapping;
6-
import cn.qaiu.vx.core.annotaions.SockRouteMapper;
3+
import cn.qaiu.vx.core.annotaions.*;
74
import cn.qaiu.vx.core.base.BaseHttpApi;
8-
import cn.qaiu.vx.core.enums.MIMEType;
9-
import cn.qaiu.vx.core.interceptor.Interceptor;
5+
import cn.qaiu.vx.core.interceptor.AfterInterceptor;
6+
import cn.qaiu.vx.core.interceptor.BeforeInterceptor;
107
import cn.qaiu.vx.core.model.JsonResult;
118
import cn.qaiu.vx.core.util.*;
129
import io.vertx.core.Future;
@@ -75,21 +72,22 @@ public RouterHandlerFactory(String gatewayPrefix) {
7572
* 开始扫描并注册handler
7673
*/
7774
public Router createRouter() {
78-
Router router = Router.router(VertxHolder.getVertxInstance());
75+
// 主路由
76+
Router mainRouter = Router.router(VertxHolder.getVertxInstance());
7977

8078
// 静态资源
8179
String path = SharedDataUtil.getJsonConfig("server")
8280
.getString("staticResourcePath");
8381
if (!StringUtils.isEmpty(path)) {
8482
// 静态资源
85-
router.route("/*").handler(StaticHandler
83+
mainRouter.route("/*").handler(StaticHandler
8684
.create(path)
8785
.setCachingEnabled(true)
8886
.setDefaultContentEncoding("UTF-8"));
8987
}
9088

9189

92-
router.route().handler(ctx -> {
90+
mainRouter.route().handler(ctx -> {
9391
LOGGER.debug("The HTTP service request address information ===>path:{}, uri:{}, method:{}",
9492
ctx.request().path(), ctx.request().absoluteURI(), ctx.request().method());
9593
ctx.response().headers().add(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
@@ -100,11 +98,15 @@ public Router createRouter() {
10098
ctx.next();
10199
});
102100
// 添加跨域的方法
103-
router.route().handler(CorsHandler.create().addRelativeOrigin(".*").allowCredentials(true).allowedMethods(httpMethods));
101+
mainRouter.route().handler(CorsHandler.create().addRelativeOrigin(".*").allowCredentials(true).allowedMethods(httpMethods));
104102

105103
// 配置文件上传路径
106-
router.route().handler(BodyHandler.create().setUploadsDirectory("uploads"));
104+
mainRouter.route().handler(BodyHandler.create().setUploadsDirectory("uploads"));
107105

106+
// 拦截器
107+
Set<Handler<RoutingContext>> interceptorSet = getInterceptorSet();
108+
Route route0 = mainRouter.route("/*");
109+
interceptorSet.forEach(route0::handler);
108110

109111
try {
110112
Set<Class<?>> handlers = reflections.getTypesAnnotatedWith(RouteHandler.class);
@@ -118,7 +120,7 @@ public Router createRouter() {
118120
for (Class<?> handler : sortedHandlers) {
119121
try {
120122
// 注册请求处理方法
121-
registerNewHandler(router, handler);
123+
registerNewHandler(mainRouter, handler);
122124
} catch (Throwable e) {
123125
LOGGER.error("Error register {}, Error details:", handler, e.getCause());
124126

@@ -128,12 +130,12 @@ public Router createRouter() {
128130
LOGGER.error("Manually Register Handler Fail, Error details:" + e.getMessage());
129131
}
130132
// 错误请求处理
131-
router.errorHandler(405, ctx -> fireJsonResponse(ctx, JsonResult
133+
mainRouter.errorHandler(405, ctx -> fireJsonResponse(ctx, JsonResult
132134
.error("Method Not Allowed", 405)));
133-
router.errorHandler(404, ctx -> ctx.response().setStatusCode(404).setChunked(true)
135+
mainRouter.errorHandler(404, ctx -> ctx.response().setStatusCode(404).setChunked(true)
134136
.end("Internal server error: 404 not found"));
135137

136-
return router;
138+
return mainRouter;
137139
}
138140

139141
/**
@@ -157,8 +159,6 @@ private void registerNewHandler(Router router, Class<?> handler) throws Throwabl
157159
method -> method.isAnnotationPresent(SockRouteMapper.class)
158160
).toList());
159161

160-
// 拦截器
161-
Handler<RoutingContext> interceptor = getInterceptor();
162162
// 依次注册处理方法
163163
for (Method method : methodList) {
164164
if (method.isAnnotationPresent(RouteMapping.class)) {
@@ -177,8 +177,6 @@ private void registerNewHandler(Router router, Class<?> handler) throws Throwabl
177177

178178
// 设置默认超时
179179
route.handler(TimeoutHandler.create(SharedDataUtil.getCustomConfig().getInteger(ROUTE_TIME_OUT)));
180-
// 先执行拦截方法, 再进入业务请求
181-
route.handler(interceptor);
182180
route.handler(ctx -> handlerMethod(instance, method, ctx)).failureHandler(ctx -> {
183181
if (ctx.response().ended()) return;
184182
ctx.failure().printStackTrace();
@@ -235,11 +233,9 @@ private String getRouteUrl(String methodName, String mapperValue) {
235233
* @return Handler
236234
* @throws Throwable Throwable
237235
*/
238-
private Handler<RoutingContext> getInterceptor() throws Throwable {
236+
private Set<Handler<RoutingContext>> getInterceptorSet() {
239237
// 配置拦截
240-
Class<?> interceptorClass = Class.forName(SharedDataUtil.getValueForCustomConfig("interceptorClassPath"));
241-
Interceptor handleInstance = (Interceptor)ReflectionUtil.newWithNoParam(interceptorClass);
242-
return handleInstance.doHandle();
238+
return getBeforeInterceptor().stream().map(BeforeInterceptor::doHandle).collect(Collectors.toSet());
243239
}
244240

245241
/**
@@ -369,11 +365,13 @@ private void handlerMethod(Object instance, Method method, RoutingContext ctx) {
369365
fireJsonResponse(ctx, res);
370366
} else if (res != null) {
371367
fireJsonResponse(ctx, JsonResult.data(res));
368+
} else {
369+
handleAfterInterceptor(ctx, null);
372370
}
371+
373372
}).onFailure(e -> fireJsonResponse(ctx, JsonResult.error(e.getMessage())));
374373
} else {
375-
ctx.response().headers().set(CONTENT_TYPE, MIMEType.TEXT_HTML.getValue());
376-
ctx.end(data.toString());
374+
fireTextResponse(ctx, data.toString());
377375
}
378376
}
379377
} catch (Throwable e) {
@@ -404,4 +402,23 @@ private String getFmt(Annotation[] parameterAnnotations, CtClass v) {
404402
}
405403
return fmt;
406404
}
405+
406+
@Override
407+
public Set<AfterInterceptor> getAfterInterceptor() {
408+
Set<Class<? extends AfterInterceptor>> afterInterceptorClassSet =
409+
reflections.getSubTypesOf(AfterInterceptor.class);
410+
if (afterInterceptorClassSet == null) {
411+
return null;
412+
}
413+
return CommonUtil.sortClassSet(afterInterceptorClassSet);
414+
}
415+
416+
private Set<BeforeInterceptor> getBeforeInterceptor() {
417+
Set<Class<? extends BeforeInterceptor>> interceptorClassSet =
418+
reflections.getSubTypesOf(BeforeInterceptor.class);
419+
if (interceptorClassSet == null) {
420+
return new HashSet<>();
421+
}
422+
return CommonUtil.sortClassSet(interceptorClassSet);
423+
}
407424
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cn.qaiu.vx.core.interceptor;
2+
3+
import io.vertx.core.http.HttpServerRequest;
4+
import io.vertx.core.json.JsonObject;
5+
6+
/**
7+
* 后置拦截器接口
8+
*
9+
* @author <a href="https://qaiu.top">QAIU</a>
10+
*/
11+
public interface AfterInterceptor {
12+
13+
void handle(HttpServerRequest request, JsonObject responseData);
14+
15+
}

core/src/main/java/cn/qaiu/vx/core/interceptor/Interceptor.java renamed to core/src/main/java/cn/qaiu/vx/core/interceptor/BeforeInterceptor.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,16 @@
44
import io.vertx.ext.web.RoutingContext;
55

66
/**
7-
* 拦截器接口
8-
* <br>Create date 2021-05-06 09:20:37
7+
* 前置拦截器接口
98
*
109
* @author <a href="https://qaiu.top">QAIU</a>
1110
*/
12-
public interface Interceptor {
11+
public interface BeforeInterceptor {
1312

1413
default Handler<RoutingContext> doHandle() {
15-
return this::beforeHandle;
14+
return this::handle;
1615
}
1716

18-
void beforeHandle(RoutingContext context);
17+
void handle(RoutingContext context);
1918

20-
void afterHandle(RoutingContext context);
2119
}

core/src/main/java/cn/qaiu/vx/core/util/CommonUtil.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cn.qaiu.vx.core.util;
22

3+
import cn.qaiu.vx.core.annotaions.HandleSortFilter;
34
import io.vertx.core.buffer.Buffer;
45
import io.vertx.core.json.JsonObject;
56
import org.apache.commons.beanutils.ConvertUtils;
@@ -15,6 +16,8 @@
1516
import java.net.UnknownHostException;
1617
import java.util.List;
1718
import java.util.Map;
19+
import java.util.Set;
20+
import java.util.stream.Collectors;
1821

1922
/**
2023
* CommonUtil
@@ -70,10 +73,11 @@ public static boolean isPortUsing(String host, int port) {
7073
} catch (UnknownHostException e) {
7174
return false;
7275
}
73-
try(Socket ignored = new Socket(Address, port)) {
74-
//建立一个Socket连接
76+
try (Socket ignored = new Socket(Address, port)) {
77+
//建立一个Socket连接
7578
flag = true;
76-
} catch (IOException ignoredException) {}
79+
} catch (IOException ignoredException) {
80+
}
7781
return flag;
7882
}
7983

@@ -126,4 +130,32 @@ public static void initConfig(String configName, Class<?> tClass) {
126130
LocalConstant.put(configName, map);
127131
LOGGER.info("读取配置{}成功", configName);
128132
}
133+
134+
public static <T> Set<T> sortClassSet(Set<Class<? extends T>> set) {
135+
return set.stream().filter(c1 -> {
136+
HandleSortFilter s1 = c1.getAnnotation(HandleSortFilter.class);
137+
if (s1 != null) {
138+
return s1.value() > 0;
139+
} else {
140+
return true;
141+
}
142+
}).sorted((c1, c2) -> {
143+
HandleSortFilter s1 = c1.getAnnotation(HandleSortFilter.class);
144+
HandleSortFilter s2 = c2.getAnnotation(HandleSortFilter.class);
145+
int n1 = 0, n2 = 0;
146+
if (s1 != null) {
147+
n1 = s1.value();
148+
}
149+
if (s2 != null) {
150+
n2 = s2.value();
151+
}
152+
return n1 - n2;
153+
}).map(c -> {
154+
try {
155+
return ReflectionUtil.newWithNoParam(c);
156+
} catch (Exception e) {
157+
throw new RuntimeException(e);
158+
}
159+
}).collect(Collectors.toSet());
160+
}
129161
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package cn.qaiu.vx.core.util;
2+
3+
import io.vertx.core.Promise;
4+
import io.vertx.core.http.HttpHeaders;
5+
import io.vertx.core.http.HttpServerResponse;
6+
7+
public class ResponseUtil {
8+
9+
public static void redirect(HttpServerResponse response, String url) {
10+
response.putHeader(HttpHeaders.LOCATION, url).setStatusCode(302).end();
11+
}
12+
13+
public static void redirect(HttpServerResponse response, String url, Promise<?> promise) {
14+
redirect(response, url);
15+
promise.complete();
16+
}
17+
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<maven.compiler.source>17</maven.compiler.source>
2020
<maven.compiler.target>17</maven.compiler.target>
2121
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
22+
2223
<packageDirectory>${project.basedir}/web-service/target/package</packageDirectory>
2324
</properties>
2425

0 commit comments

Comments
 (0)