rust actix-web定义中间件(middleware)记录接口耗时(接口耗时中间件和鉴权中间件)
use actix_web::{dev::ServiceRequest, dev::ServiceResponse, Error};
use std::time::SystemTime;
/// 日志打印中间件
/// 记录请求的开始时间,响应时间,并打印日志
pub fn log_middleware<S>(req: ServiceRequest, srv: &S) -> Result<ServiceResponse, Error>
where
S: ActixWebService,
{
// 记录请求开始时间
let start = SystemTime::now();
// 设置自定义数据,以便在后续中间件和处理器中访问
req.extensions_mut().insert(start);
let result = srv.call(req);
// 处理result,记录日志
match result {
Ok(response) => {
let res = response.map_err(|e| e.into())?;
let duration = start.elapsed().unwrap().as_millis();
// 打印日志,例如:"GET /index 200 10ms"
println!("{} {} {} {}ms", req.method(), req.path(), res.status(), duration);
Ok(res)
},
Err(e) => {
let duration = start.elapsed().unwrap().as_millis();
// 打印错误日志
println!("{} {} {} {}ms", req.method(), req.path(), e.status(), duration);
Err(e)
}
}
}
/// 鉴权中间件
/// 检查请求是否有有效的鉴权信息
pub fn auth_middleware<S>(req: ServiceRequest, srv: &S) -> Result<ServiceResponse, Error>
where
S: ActixWebService,
{
// 假设我们有一个鉴权逻辑
let auth_header = req.headers().get("Authorization");
if let Some(header) = auth_header {
// 鉴权逻辑...
if header == "Bearer valid_token" {
// 鉴权通过,继续处理请求
srv.call(req)
} else {
// 返回401未授权响应
Err(actix_web::error::ErrorUnauthorized("Authorization header invalid"))
}
} else {
// 没有鉴权头,返回401未授权响应
Err(actix_web::error::ErrorUnauthorized("Missing Authorization header"))
}
}
// 使用中间件
fn main() {
// 注册中间件,确保它们按正确的顺序注册
App::new()
.wrap(log_middleware)
.wrap(auth_middleware)
// ... 其他设置和服务
}
这个代码示例展示了如何在Rust的actix-web框架中定义和使用自定义的日志记录中间件和鉴权中间件。这些中间件可以被注册到actix-web应用中,并在请求处理管道中按预定义的顺序执行。在实际应用中,你需要替换日志打印和鉴权逻辑以满足你的具体需求。
评论已关闭