飞镖中的会话

Luk*_*asz 8 cookies session http dart

通常,dart文档在几乎任何主题上都有很多有用的示例.不幸的是我在飞镖的会话中找不到任何东西.

任何人都可以将此方法验证为正确的会话方式:

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

我特别感兴趣的是第4,5和6点,因为其他的都有很好的记录.如果您可以在这一点上分享一些代码片段,我将非常感激.

编辑:在阅读GünterZö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)); 
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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');
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,在阅读了shelf_auth文档后,我仍然不知道在哪里添加身份验证.他们使用Pipline语法处理程序.

Ted*_*ddy 3

我将描述会话在 Java 中如何与servlet一起工作。这可以帮助您顺利实施。首先,我必须提到会话身份验证是两个独立的功能,尽管后者依赖于前者。

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

  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,如果时间不长,服务器仍然会挂起该会话。因此,会议将继续进行。

服务器端的Session使用:

  • 会话只是一个 HashMap,它将 JSESSIONID 与另一组属性进行映射。
  • 有一个线程监视会话的运行时间,并在会话过期后从内存中删除 JSESSIONID 和映射的属性。
  • 通常,有一些规定可以让应用程序在会话即将到期时收到事件警报。

实施细节:

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

身份验证机制只是利用上述会话处理来检测“新会话”并将其转移到登录页面。此外,现有会话可用于存储诸如“auth-status”-“通过”或“失败”之类的属性。