通常,dart 文档有很多关于几乎所有主题的有用示例。不幸的是,我在 dart 的 session 中找不到任何内容。
谁能验证这种方法是进行 session 的正确方法:
- 浏览器向服务器发送 GET 请求。
- 服务器响应网络客户端。
- Web 客户端发送用户凭据。
- > a) 服务器检查凭据并生成 session cookie。 b) 服务器将 session cookie 发送回客户端。
- Web 客户端存储 cookie 以供进一步使用。
- Web 客户端发送一些用户特定数据的请求,并附加 cookie 以进行验证。
我特别感兴趣的是第 4、5 和 6 点,因为其他的都有详细记录。如果您能就此分享一些代码片段,我将不胜感激。
编辑: 在阅读了下面 Günter Zöchbauer 的评论后,我查看了 shelf_auth。我意识到它需要重写服务器应用程序才能使用 shelf。 所以我就这么做了。
main.dart:
// imports of all necessary libraries
main() {
runServer();
}
/**
* Code to handle Http Requests
*/
runServer() {
var staticHandler = createStaticHandler(r"C:\Users\Lukasz\dart\auctionProject\web", defaultDocument: 'auctionproject.html');
var handler = new Cascade()
.add(staticHandler) // serves web-client
.add(routes.handler) // serves content requested by web-client
.handler;
io.serve(handler, InternetAddress.LOOPBACK_IP_V4, 8080).then((server) {
print('Listening on port 8080');
}).catchError((error) => print(error));
}
routes.dart
import 'handlers.dart' as handler;
import 'package:shelf_route/shelf_route.dart';
import 'package:shelf_auth/shelf_auth.dart' as sAuth;
Router routes = new Router()
..get('/anonymous', handler.handleAnonymousRequest);
//..post('/login', handler.handleLoginRequest); << this needs to be implemented
//other routs will come later
handlers.dart
import 'dart:async';
import 'dart:convert';
import 'dart:io' show HttpHeaders;
import 'databaseUtility.dart';
import 'package:shelf_exception_response/exception.dart';
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf_path/shelf_path.dart';
shelf.Response handleAnonymousRequest(shelf.Request request) {
return new shelf.Response.ok('got anonymous get request');
}
不幸的是在阅读了shelf_auth之后文档我仍然不太清楚在哪里添加身份验证。他们对处理程序使用 Pipline 语法。
最佳答案
我将描述 session 如何在 Java 中与 servlet 一起工作。这可以帮助您完成实现工作。首先,我必须提到 session 和 authentication 是两个独立的功能,尽管后者依赖于前者。
session 可帮助服务器理解来自同一浏览器的连续请求,而中间不会有大量空闲时间。看看下面的例子:
- 用户打开浏览器 A,访问了您的网站
- 在浏览器 A 中使用多个选项卡不断点击各种链接
- 让浏览器闲置 45 分钟
- 继续点击他打开的页面
- 打开浏览器 B,访问了您的网站
- 在浏览器 B 中关闭了您网站的标签页
- 在浏览器 B 中打开另一个新标签页并点击一个书签以 访问您的网站
下面是用户上述步骤对服务器端 session 的影响:
- 已创建新 session ...假设 JSESSIONID 10203940595940
- 同一 session 适用于来自所有选项卡的所有请求
- session 在服务器上过期,并且可能在服务器上释放了一些内存
- 由于 Java 无法找到与 JSESSIONID 10203940595940 匹配的 session ,它会创建一个新 session 并要求客户端记住新的 JSESSIONID w349374598457
- 来自新浏览器的请求被视为新 session ,因为 JSESSIONID 契约(Contract)是在单个浏览器和服务器之间进行的。因此,服务器分配一个新的 JSESSIONID,例如 956879874358734
- JSESSIONID 在浏览器中停留,直到浏览器退出。关闭选项卡不会清除 JSESSIONID
- JSESSIONID 仍在被浏览器使用,如果时间不长,服务器仍会卡在该 session 上。所以,seison 将继续。
服务器端的 session 使用:
- session 只是一个将 JSESSIONID 与另一个映射的 HashMap 一堆属性。
- 有一个线程监控 session 的运行时间,并且 一次从内存中删除 JSESSIONIDs 和映射的属性 session 到期。
- 通常,应用程序有一些规定来获取事件 仅在 session 准备好到期时发出警报。
实现细节:
- 用户的浏览器 A 向服务器发送请求。服务器检查是否有 名为 JSESSIONID 的 Cookie。如果没有找到,则创建一个 服务器。服务器记下新的 JSESSIONID,创建的 时间,最后一次请求时间与创建时间相同 这个案例。在 HTTP 响应中,服务器附加新的 JSESSIONID 作为 cookie。
- 浏览器旨在为后续访问保持附加 cookie 到同一个网站。因此,对于该站点的所有后续访问, 浏览器不断将 JSESSIONID cookie 附加到 HTTP 请求 标题。
- 因此,这次服务器看到了 JSESSIONID 并且能够映射 请求现有 session ,以防 session 尚未 已到期。如果 session 已经过期,服务器将 创建一个新 session 并将新的 JSESSIONID 作为 cookie 附加回来 在 HTTP 响应中。
身份验证机制只是利用上述 session 处理来检测“新 session ”并将它们转移到登录页面。此外,现有 session 可用于存储诸如“auth-status”-“pass”或“fail”之类的属性。
关于http - Dart session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30107414/