飞镖中的会话

时间:2015-05-07 16:59:50

标签: http session cookies dart

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

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

  1. 浏览器向服务器发送GET请求。
  2. 服务器以web-client响应。
  3. Web客户端发送用户凭据。
  4. a)服务器检查凭据并生成会话cookie。 b)服务器将会话cookie发送回客户端。
  5. Web客户端存储cookie以供进一步使用。
  6. Web客户端发送对某些用户特定数据的请求,并附加cookie以进行验证。
  7. 我特别感兴趣的是第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)); 
    }
    

    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语法处理程序。

1 个答案:

答案 0 :(得分:2)

我将用 servlets 描述Java中的会话是如何工作的。这可以帮助您实现您的实施。首先,我必须提到会话身份验证是两个独立的功能,虽然后者依赖于前者。

会话有助于服务器了解来自同一浏览器的连续请求,而两者之间没有大的空闲时间。看看下面的例子:

  1. 用户打开了浏览器A,访问了您的网站
  2. 使用浏览器A中的多个标签保持点击各种链接
  3. 让浏览器空闲45分钟
  4. 继续点击他打开的页面
  5. 打开浏览器B,访问了您的网站
  6. 在浏览器B中关闭您网站的标签
  7. 在浏览器B中打开另一个新标签,然后点击书签 访问您的网站
  8. 以下是用户上述步骤对服务器端会话的影响:

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

      • 会话只是一个HashMap,它将JSESSIONIDs映射到另一个a 一堆属性。
      • 会话的线程监视已用时间,以及 一次从内存中删除JSESSIONID和映射的属性 会话到期。
      • 通常,应用程序可以提供一些事件 当会话准备好到期时发出警报。

      实施细节:

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

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