Skip to content

Router 路由组件 📌

This content is not available in your language yet.

Feat中的Router组件是一个功能强大的HTTP请求分发器,用于将HTTP请求分发到对应的处理程序(Handler)。它是基于NodePath树状结构实现的,支持多种路由匹配方式,包括精确匹配、通配符匹配、路径参数匹配等。同时提供了Session管理和请求拦截等高级功能。

主要功能

1. 基础功能

  • 路由匹配:根据请求的URI将请求分发到对应的处理程序
  • 路径参数提取:支持从路径中提取参数
  • 多种匹配方式:支持精确匹配、通配符匹配(*)、路径参数匹配(:param)等
  • 默认路由:未匹配到任何路由时,使用默认处理程序

2. 高级功能

  • Session管理:提供完整的Session生命周期管理,支持创建、获取、更新和销毁Session
  • 请求拦截:支持配置拦截器,实现请求的前置和后置处理
  • 灵活配置:支持链式调用,简化路由配置

路由匹配原理

Router原理图

1. 核心数据结构

Router内部通过NodePath树状结构存储路由规则:

  • 根节点:表示根路径/
  • 路径节点:每个NodePath节点代表一个路径部分(如/user:id
  • 叶子节点:存储具体的处理程序(RouterHandler)

2. 匹配流程

  1. 解析请求URI:将请求URI拆分为路径部分
  2. 树状匹配
    • 从根节点开始,逐层匹配路径部分
    • 优先进行精确匹配,其次是路径参数匹配,最后是通配符匹配
  3. 参数提取:如果匹配到路径参数(如:id),将其提取到Context
  4. 处理程序调用:调用匹配到的处理程序,如未匹配则使用默认处理程序

Session管理

1. Session配置

Session管理机制

Router router = new Router();
router.getSessionOptions()
.setMaxAge(1800); // 设置Session过期时间为30分钟

2. Session操作

router.route("/session/demo", ctx -> {
// 获取或创建Session
Session session = ctx.getSession();
// 设置Session属性
session.setAttribute("userId", "12345");
// 获取Session属性
String userId = session.getAttribute("userId");
// 手动使Session失效
session.invalidate();
});

拦截器使用

拦截器执行流程

1. 创建拦截器

public class LogInterceptor implements Interceptor {
@Override
public void intercept(Context ctx, Chain chain) throws Throwable {
System.out.println("请求开始: " + ctx.Request.getRequestURI());
try {
chain.proceed(ctx);
} finally {
System.out.println("请求结束: " + ctx.Request.getRequestURI());
}
}
}

2. 配置拦截器

Router router = new Router();
// 为所有/api路径下的请求添加拦截器
router.addInterceptor("/api/*", new LogInterceptor());
// 为多个路径添加拦截器
List<String> patterns = Arrays.asList("/user/*", "/order/*");
router.addInterceptors(patterns, new LogInterceptor());

路由配置示例

1. 基础路由

Router router = new Router();
// 精确匹配
router.route("/user/info", ctx -> {
ctx.Response.write("User info");
});
// 路径参数匹配
router.route("/user/:id", ctx -> {
String id = ctx.pathParam("id");
ctx.Response.write("User ID: " + id);
});
// 通配符匹配
router.route("/api/*", ctx -> {
ctx.Response.write("API endpoint");
});

2. 默认路由

Router router = new Router(request -> {
request.getResponse()
.setHttpStatus(HttpStatus.NOT_FOUND)
.write("404 Not Found");
});

3. 深层路由示例

public class DeepRouterDemo {
public static void main(String[] args) {
Router router = new Router();
// 1. 精确匹配(最高优先级)
router.route("/api/v1/user/profile", ctx -> {
ctx.Response.write("用户档案");
});
// 2. 路径参数匹配(次高优先级)
router.route("/api/v1/user/:id/orders", ctx -> {
String userId = ctx.pathParam("id");
ctx.Response.write("用户" + userId + "的订单列表");
});
// 3. 多路径参数匹配
router.route("/api/v1/user/:userId/orders/:orderId", ctx -> {
String userId = ctx.pathParam("userId");
String orderId = ctx.pathParam("orderId");
ctx.Response.write("用户" + userId + "的订单" + orderId + "详情");
});
// 4. 通配符匹配(最低优先级)
router.route("/api/v1/user/*", ctx -> {
ctx.Response.write("用户相关API");
});
// 5. 多层通配符匹配
router.route("/api/*/user/*/*", ctx -> {
ctx.Response.write("通用用户API处理");
});
}
}

上述示例展示了深层路由的匹配优先级规则:

  1. 精确路径匹配:完全匹配URL路径,如/api/v1/user/profile
  2. 路径参数匹配:包含:param形式的参数,如/api/v1/user/:id/orders
  3. 通配符匹配:包含*的路径,如/api/v1/user/*/api/*/user/*/*

4. 完整示例

public class RouterDemo {
public static void main(String[] args) {
Router router = new Router();
// 配置Session
router.getSessionOptions().setMaxAge(1800);
// 添加拦截器
router.addInterceptor("/*", new LogInterceptor());
// 配置路由
router.route("/", ctx -> {
Session session = ctx.getSession();
session.setAttribute("visitTime", System.currentTimeMillis());
ctx.Response.write("Welcome!");
});
router.route("/user/:id", ctx -> {
String id = ctx.pathParam("id");
Session session = ctx.getSession(false); // 获取Session但不创建
if (session != null) {
Long visitTime = session.getAttribute("visitTime");
ctx.Response.write("User " + id + ", last visit: " + visitTime);
} else {
ctx.Response.write("User " + id);
}
});
// 启动服务器
Feat.httpServer()
.httpHandler(router)
.listen();
}
}

总结

Feat中的Router组件不仅提供了强大的路由匹配功能,还集成了Session管理和请求拦截等高级特性。通过树状的路由匹配结构,实现了高效的请求分发。同时,其链式调用的API设计,使得路由配置更加简洁直观。开发者可以根据实际需求,灵活运用这些功能,构建功能丰富的Web应用。