【问题标题】:Sessions in dart飞镖会话
【发布时间】:2015-07-18 09:36:59
【问题描述】:

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

任何人都可以验证这种方法是否是进行会话的正确方法:

  1. 浏览器向服务器发送 GET 请求。
  2. 服务器以网络客户端响应。
  3. Web 客户端发送用户凭据。
  4. a) 服务器检查凭据并生成会话 cookie。 b) 服务器将会话 cookie 发送回客户端。
  5. Web 客户端存储 cookie 以供进一步使用。
  6. Web 客户端发送对某些用户特定数据的请求,并附加 cookie 进行验证。

我特别感兴趣的是第 4 点、第 5 点和第 6 点,因为其他点都有据可查。如果你能在这点上分享一些代码sn-ps,我将非常感激。

编辑: 在阅读了下面 Günter Zöchbauer 的评论后,我查看了shelf_auth。我意识到它需要重写服务器应用程序才能使用货架。 所以我就这么做了。

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)); 
}

路线.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 语法。

【问题讨论】:

标签: http session cookies dart


【解决方案1】:

我将用 servlets 描述会话在 Java 中是如何工作的。这可以帮助您使您的实施工作。首先,我不得不提一下 sessionauthentication 是两个独立的函数,虽然后者依赖于前者。

会话可帮助服务器了解来自同一浏览器的连续请求,而不会在两者之间产生大量空闲时间。看看下面的例子:

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

以下是用户上述步骤对服务器端会话的影响:

  1. 已创建新会话...让我们说 JSESSIONID 10203940595940
  2. 同一会话适用于来自所有选项卡的所有请求
  3. 服务器上的会话已过期,并且可能在服务器上释放了一些内存
  4. 由于 Java 无法找到匹配 JSESSIONID 10203940595940 的会话,它会创建一个新会话并要求客户端记住新的 JSESSIONID w349374598457
  5. 来自新浏览器的请求被视为新会话,因为 JSESSIONID 合同在单个浏览器和服务器之间。因此,服务器分配了一个新的 JSESSIONID,例如 956879874358734
  6. JSESSIONID 在浏览器中徘徊,直到浏览器退出。关闭选项卡不会清除 JSESSIONID
  7. 浏览器仍在使用JSESSIONID,如果时间不长,服务器仍将挂在该会话上。因此,会议将继续进行。

服务器端的会话使用:

  • 会话只是一个 HashMap,它将 JSESSIONID 与另一个会话映射 一堆属性。
  • 有一个线程监视会话的经过时间,并且 一次从内存中删除 JSESSIONID 和映射的属性 会话到期。
  • 通常,应用程序有一些规定可以获取事件 仅在会话即将到期时发出警报。

实现细节:

  • 用户的浏览器 A 向服务器发送请求。服务器检查是否存在 一个名为 JSESSIONID 的 Cookie。如果没有找到,则在 服务器。服务器记下新的 JSESSIONID,创建的 时间,最后一次请求时间与创建时间相同 这个案例。在 HTTP 响应中,服务器附加新的 JSESSIONID 作为 cookie。
  • 浏览器旨在为后续访问持续附加 cookie 到同一个站点。因此,对于该网站的所有后续访问, 浏览器不断将 JSESSIONID cookie 附加到 HTTP 请求 标题。
  • 所以,这一次服务器看到了 JSESSIONID 并且能够映射 请求现有会话,以防会话尚未 已到期。如果会话已经过期,服务器将 创建一个新会话并将新的 JSESSIONID 作为 cookie 附加回来 在 HTTP 响应中。

身份验证机制只是利用上述会话处理来检测“新会话”并将它们转移到登录页面。此外,现有会话可用于存储“auth-status”-“pass”或“fail”等属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2019-06-29
    相关资源
    最近更新 更多