gpt4 book ai didi

Flutter http 维护 PHP session

转载 作者:IT老高 更新时间:2023-10-28 12:43:56 30 4
gpt4 key购买 nike

我是新来的 flutter 。基本上我正在为我的 Web 应用程序使用代码 Igniter 框架。我为我的网络应用程序创建了 REST API,在用户使用 API 登录后,所有方法都会检查 session_id 如果它存在则继续,如果不存在则给出

{ ['status'] = false, ['message'] = 'unauthorized access' }

我正在使用 flutter 创建应用程序,当我使用 flutter 的 http 方法时,它会更改每个请求的 session 。我的意思是,它不维护 session 。我认为它每次都会破坏并创造新的联系。这是我用于 api 调用获取和发布请求的 thr 类方法。

class ApiCall {  
static Map data;
static List keys;

static Future<Map> getData(url) async {
http.Response response = await http.get(url);
Map body = JSON.decode(response.body);
data = body;
return body;
}

static Future postData(url, data) async {
Map result;
http.Response response = await http.post(url, body: data).then((response) {
result = JSON.decode(response.body);
}).catchError((error) => print(error.toString()));

data = result;
keys = result.keys.toList();

return result;
}

我想发出 API 请求,然后存储 session_id,是否可以在服务器上维护 session ,以便我可以在自己的网络应用程序上管理身份验证。

最佳答案

HTTP 是一种无状态协议(protocol),因此服务器需要某种方式来识别客户端在向服务器发出的第二个、第三个和后续请求时。在您的情况下,您可能会使用第一个请求进行身份验证,因此您希望服务器在后续请求中记住您,以便它知道您已经通过身份验证。一种常见的方法是使用 cookies .

Igniter 发送一个带有 session id 的 cookie。您需要从每个响应中收集它并在下一个请求中将其发送回。 (服务器有时会更改 session ID(以减少我们还不需要考虑的点击劫持等事情),因此您需要不断从每个响应中提取 cookie。)

cookie 作为一个名为 set-cookie 的 HTTP 响应 header 到达(可能不止一个,但希望不是为了简单起见)。要发回 cookie,您需要在后续请求中添加一个名为 cookie 的 HTTP 请求 header ,复制您从 set-cookie header 中提取的一些信息。

希望 Igniter 只发送一个 set-cookie header ,但出于调试目的,您可能会发现使用 response.headers.forEach((a, b) 将它们全部打印出来很有用=> print('$a: $b'));.你应该找到 Set-Cookie: somename=abcdef;可选的东西。我们需要将字符串提取到,但不包括 ;,即 somename=abcdef

在下一个和后续请求中,通过更改您的 post,将请求 header 添加到您的 {'Cookie': 'somename=abcdef'} 的下一个请求中命令:

http.post(url, body: data, headers:{'Cookie': cookie})

顺便说一句,我认为您上面的代码中的 awaitthen 不匹配。通常,如果它们应该是顶级函数,那么您不希望在类中使用静态变量。相反,您可以创建一个 cookie 感知类,如:

class Session {
Map<String, String> headers = {};

Future<Map> get(String url) async {
http.Response response = await http.get(url, headers: headers);
updateCookie(response);
return json.decode(response.body);
}

Future<Map> post(String url, dynamic data) async {
http.Response response = await http.post(url, body: data, headers: headers);
updateCookie(response);
return json.decode(response.body);
}

void updateCookie(http.Response response) {
String rawCookie = response.headers['set-cookie'];
if (rawCookie != null) {
int index = rawCookie.indexOf(';');
headers['cookie'] =
(index == -1) ? rawCookie : rawCookie.substring(0, index);
}
}
}

关于Flutter http 维护 PHP session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50299253/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com