http - Dart session

标签 http session cookies dart

通常,dart 文档有很多关于几乎所有主题的有用示例。不幸的是,我在 dart 的 session 中找不到任何内容。

谁能验证这种方法是进行 session 的正确方法:

  1. 浏览器向服务器发送 GET 请求。
  2. 服务器响应网络客户端。
  3. Web 客户端发送用户凭据。
  4. > a) 服务器检查凭据并生成 session cookie。 b) 服务器将 session cookie 发送回客户端。
  5. Web 客户端存储 cookie 以供进一步使用。
  6. 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 一起工作。这可以帮助您完成实现工作。首先,我必须提到 sessionauthentication 是两个独立的功能,尽管后者依赖于前者。

session 可帮助服务器理解来自同一浏览器的连续请求,而中间不会有大量空闲时间。看看下面的例子:

  1. 用户打开浏览器 A,访问了您的网站
  2. 在浏览器 A 中使用多个选项卡不断点击各种链接
  3. 让浏览器闲置 45 分钟
  4. 继续点击他打开的页面
  5. 打开浏览器 B,访问了您的网站
  6. 在浏览器 B 中关闭了您网站的标签页
  7. 在浏览器 B 中打开另一个新标签页并点击一个书签以 访问您的网站

下面是用户上述步骤对服务器端 session 的影响:

  1. 已创建新 session ...假设 JSESSIONID 10203940595940
  2. 同一 session 适用于来自所有选项卡的所有请求
  3. session 在服务器上过期,并且可能在服务器上释放了一些内存
  4. 由于 Java 无法找到与 JSESSIONID 10203940595940 匹配的 session ,它会创建一个新 session 并要求客户端记住新的 JSESSIONID w349374598457
  5. 来自新浏览器的请求被视为新 session ,因为 JSESSIONID 契约(Contract)是在单个浏览器和服务器之间进行的。因此,服务器分配一个新的 JSESSIONID,例如 956879874358734
  6. JSESSIONID 在浏览器中停留,直到浏览器退出。关闭选项卡不会清除 JSESSIONID
  7. 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/

相关文章:

php - 即使浏览器关闭,CodeIgniter 如何保留 session 数据?

php - CakePHP2 : CORS Preflight issues with JWT Auth

http - 提供身份验证时,代理会缓存 HTTP 响应吗?

ios - session 存储在设备中不起作用

android - WebView 没有使用 Cookie 来加载图像

javascript - 获取、设置 cookie 和 csrf

java - 为什么我的 SOCKS 代理代码抛出 SocketException : Malformed reply from SOCKS server?

python httplib httpException 错误代码

java - Spring MVC 中的@SessionAttributes 何时被删除? (带代码示例)

php - 如何在PHP中安全实现 "Remember me"按钮(持久登录)