当使用Redis作为会话存储时,如何在actix会话和PHP应用程序之间共享会话?

当使用Redis作为会话存储时,如何在actix会话和PHP应用程序之间共享会话?,php,session,rust,rust-actix,actix-web,Php,Session,Rust,Rust Actix,Actix Web,我想将使用Redis作为会话存储的PHP网站切换到actix web。我遇到的唯一问题是在我的子域之间共享会话。我有很多服务,其中只有一部分会换成Rust A: 使用actix_会话:{CookieSession,session}; 使用actix_web::{web,App,Error,HttpResponse,HttpServer}; fn指数(疗程:疗程)->结果actix疗程,以及 要验证,请运行并使用curl执行请求: $curl-v localhost:8080 >GET/HTTP/

我想将使用Redis作为会话存储的PHP网站切换到actix web。我遇到的唯一问题是在我的子域之间共享会话。我有很多服务,其中只有一部分会换成Rust

A:

使用actix_会话:{CookieSession,session};
使用actix_web::{web,App,Error,HttpResponse,HttpServer};
fn指数(疗程:疗程)->结果actix疗程,以及

要验证,请运行并使用curl执行请求:

$curl-v localhost:8080
>GET/HTTP/1.1
>主机:本地主机:8080
>用户代理:curl/7.54.0
>接受:*/*
>
通过以下方式解码:

解码组件(“中兴通讯%2Fb%2F085+VQcxL%2FQRKCnldUxzoc%2FNEOQe94PTBGUfc%3D%7B%22计数器%22%3A%221%22%7D”) '中兴通讯/b/085+VQcxL/QRKCnldUxzoc/NEOQe94PTBGUfc={“计数器”:“1”}'
据我所知,中兴通讯/b/085+VQcxL/QRKCnldUxzoc/NEOQe94PTBGUfc=是签名

这可能不是您的PHP脚本所做的,因此您可能希望直接使用。例如,通过创建自己的
会话
类型,然后在处理程序中使用该类型:

使用actix_web:{web,App,Error,HttpServer,HttpRequest,HttpResponse,FromRequest};
使用actix_web::dev::Payload;
使用actix_web::http::header::{COOKIE,SET_COOKIE};
使用actix_web::error::ErrorUnauthorized;
fn main(){
HttpServer::新建(|||){
App::new()
.route(“/set”,web::to(set_cookie))
.route(“/get”,web::to(get_cookie))
})
.bind(“127.0.0.1:8000”)
.expect(“无法绑定到端口8000”)
.run()
.expect(“无法运行服务器”);
}
fn set_cookie()->HttpResponse{
HttpResponse::Ok()
.header(SET_COOKIE,Session::COOKIE(“0123456789abcdef”))
.body(“cookie集”)
}
fn get_cookie(会话:会话)->HttpResponse{
HttpResponse::Ok()
.header(设置会话COOKIE,会话::COOKIE(“新会话值”))
.body(格式!(“获取cookie{},&session.0))
}
结构会话(字符串);
impl会话{
const COOKIE_NAME:&'static str=“我的会话”;
fn cookie(值:&str)->字符串{
字符串::from(Self::COOKIE_NAME)+“=”+值
}
}
impl FROM会话请求{
类型错误=错误;
类型未来=结果;
类型Config=();
fn来自_请求(请求:&HttpRequest,_有效负载:&mut有效负载)->Self::Future{
对于req.headers()中的头,获取所有(COOKIE){
//检查标头是否为UTF-8
如果让Ok(值)=标题到_str(){
//拆分为cookie值
用于c的value.split(“;”).map(|s | s.trim()){
//在“=”处拆分
如果让一些(pos)=c.find('=')){
//会话密钥是什么?
如果Self::COOKIE_NAME==&c[0..pos]{
返回Ok(会话(字符串::from(&c[(pos+1)…]));
}
}
}
}
}
错误(ErrorUnauthorized(“缺少会话cookie”))
}
}
结果(为了简洁起见,删除了不相关的标题):

$curl-v localhost:8000/get
Cookie:my session=0123456789abcdef
>
您还可以在浏览器、URL和中观察结果

这非常简单,但可以让您完全控制会话cookies

注意:上述解决方案对保护cookie没有任何作用。

actix会话,以及

要验证,请运行并使用curl执行请求:

$curl-v localhost:8080
>GET/HTTP/1.1
>主机:本地主机:8080
>用户代理:curl/7.54.0
>接受:*/*
>
通过以下方式解码:

解码组件(“中兴通讯%2Fb%2F085+VQcxL%2FQRKCnldUxzoc%2FNEOQe94PTBGUfc%3D%7B%22计数器%22%3A%221%22%7D”) '中兴通讯/b/085+VQcxL/QRKCnldUxzoc/NEOQe94PTBGUfc={“计数器”:“1”}'
据我所知,中兴通讯/b/085+VQcxL/QRKCnldUxzoc/NEOQe94PTBGUfc=
是签名

这可能不是您的PHP脚本所做的,因此您可能希望直接使用。例如,通过创建自己的
会话
类型,然后在处理程序中使用该类型:

使用actix_web:{web,App,Error,HttpServer,HttpRequest,HttpResponse,FromRequest};
使用actix_web::dev::Payload;
使用actix_web::http::header::{COOKIE,SET_COOKIE};
使用actix_web::error::ErrorUnauthorized;
fn main(){
HttpServer::新建(|||){
App::new()
.route(“/set”,web::to(set_cookie))
.route(“/get”,web::to(get_cookie))
})
.bind(“127.0.0.1:8000”)
.expect(“无法绑定到端口8000”)
.run()
.expect(“无法运行服务器”);
}
fn set_cookie()->HttpResponse{
HttpResponse::Ok()
.header(SET_COOKIE,Session::COOKIE(“0123456789abcdef”))
.body(“cookie集”)
}
fn get_cookie(会话:会话)->HttpResponse{
HttpResponse::Ok()
.header(设置会话COOKIE,会话::COOKIE(“新会话值”))
.body(格式!(“获取cookie{},&session.0))
}
结构会话(字符串);
impl会话{
const COOKIE_NAME:&'static str=“我的会话”;
fn cookie(值:&str)->字符串{
字符串::from(Self::CO)