sa_token_adapter/
context.rs

1// Author: 金书记
2//
3//! 请求/响应上下文适配器trait定义
4
5use std::collections::HashMap;
6use serde::{Deserialize, Serialize};
7
8/// 请求上下文trait
9/// 
10/// 各个Web框架需要为其Request类型实现这个trait
11pub trait SaRequest {
12    /// 获取请求头
13    fn get_header(&self, name: &str) -> Option<String>;
14    
15    /// 获取所有请求头
16    fn get_headers(&self) -> HashMap<String, String> {
17        HashMap::new() // 默认实现
18    }
19    
20    /// 获取Cookie
21    fn get_cookie(&self, name: &str) -> Option<String>;
22    
23    /// 获取所有Cookie
24    fn get_cookies(&self) -> HashMap<String, String> {
25        HashMap::new() // 默认实现
26    }
27    
28    /// 获取查询参数
29    fn get_param(&self, name: &str) -> Option<String>;
30    
31    /// 获取所有查询参数
32    fn get_params(&self) -> HashMap<String, String> {
33        HashMap::new() // 默认实现
34    }
35    
36    /// 获取请求路径
37    fn get_path(&self) -> String;
38    
39    /// 获取请求方法
40    fn get_method(&self) -> String;
41    
42    /// 获取请求URI
43    fn get_uri(&self) -> String {
44        self.get_path()
45    }
46    
47    /// 获取请求体(如果是JSON)
48    fn get_body_json<T: for<'de> Deserialize<'de>>(&self) -> Option<T> {
49        None // 默认实现
50    }
51    
52    /// 获取客户端IP
53    fn get_client_ip(&self) -> Option<String> {
54        None // 默认实现
55    }
56    
57    /// 获取User-Agent
58    fn get_user_agent(&self) -> Option<String> {
59        self.get_header("user-agent")
60    }
61}
62
63/// 响应上下文trait
64/// 
65/// 各个Web框架需要为其Response类型实现这个trait
66pub trait SaResponse {
67    /// 设置响应头
68    fn set_header(&mut self, name: &str, value: &str);
69    
70    /// 设置Cookie
71    fn set_cookie(&mut self, name: &str, value: &str, options: CookieOptions);
72    
73    /// 删除Cookie
74    fn delete_cookie(&mut self, name: &str) {
75        self.set_cookie(name, "", CookieOptions {
76            max_age: Some(0),
77            ..Default::default()
78        });
79    }
80    
81    /// 设置状态码
82    fn set_status(&mut self, status: u16);
83    
84    /// 设置响应体(JSON)
85    fn set_json_body<T: Serialize>(&mut self, body: T) -> Result<(), serde_json::Error>;
86}
87
88/// Cookie 选项
89#[derive(Debug, Clone, Default)]
90pub struct CookieOptions {
91    /// 域名
92    pub domain: Option<String>,
93    
94    /// 路径
95    pub path: Option<String>,
96    
97    /// 过期时间(秒)
98    pub max_age: Option<i64>,
99    
100    /// 是否仅HTTP
101    pub http_only: bool,
102    
103    /// 是否安全(仅HTTPS)
104    pub secure: bool,
105    
106    /// SameSite属性
107    pub same_site: Option<SameSite>,
108}
109
110/// SameSite 属性
111#[derive(Debug, Clone, Copy)]
112pub enum SameSite {
113    Strict,
114    Lax,
115    None,
116}
117
118impl std::fmt::Display for SameSite {
119    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
120        match self {
121            SameSite::Strict => write!(f, "Strict"),
122            SameSite::Lax => write!(f, "Lax"),
123            SameSite::None => write!(f, "None"),
124        }
125    }
126}