Handler 是一个全局的拦截器,我们来看看 Cloudopt Next 自带的 ShowRouteHandler。
@AutoHandler
class ShowRouteHandler : Handler {
override fun preHandle(resource: Resource): Boolean {
if (ConfigManager.config.showRoute) {
val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
logger.info(
"Match route ----------------- " + df.format(Date())
+ " ------------------------------"
)
logger.info("Method : ${resource.request.method()}")
logger.info("Path : ${resource.context.normalisedPath()}")
logger.info("User-Agent : ${resource.request.getHeader("User-Agent")}")
val params = resource.request.params()
params.forEach { entry ->
if (params.contains(entry.key)) {
params.remove(entry.key)
params.add(entry.key, entry.value)
}
}
logger.info("Params : ${Jsoner.toJsonString(params?.entries() ?: "[]")}")
logger.info("Cookie : ${Jsoner.toJsonString(resource.request.getHeader("Cookie") ?: "")}")
logger.info(
"--------------------------------------------------------------------------------"
)
}
return true
}
override fun postHandle(resource: Resource): Boolean {
return true
}
override fun afterRender(resource: Resource, bodyString: String): Boolean {
return true
}
override fun afterCompletion(resource: Resource): Boolean {
return true
}
companion object {
private val logger = Logger.getLogger(ShowRouteHandler::class.java)
}
}
如果您需要创建一个自己的Handler,只需要继承Handler类即可。如果类上面添加了@AutoHandler注解,Cloudopt Next在启动时会自动注册。如果您只想手动注册的话,可以在服务器启动前手动增加。
preHandle 是在请求到达后开始处理前执行,也就是在执行路由方法前。
postHandle 是在路由方法执行完,执行 render 之前执行。
afterRender 是在 render 完成之后,返回数据给用户之前。会自动将 render 的渲染结果注入到方法中。
afterCompletion 是在请求结束并断开后执行。
你可以通过下面的方法使用一个 Handler:
NextServer.addHandler(ShowRouteHandler())
NextServer.run(App::class.java)
NextServer.addHandler(new ShowRouteHandler());
NextServer.run(App.class);