问题标签 [stateless-session]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1987 浏览

c# - 使用 NHibernate StatelessSession 级联集合

使用无状态会话批量插入包含其他实体集合(HasMany映射)的实体的正确方法是什么?

例如,父类映射如下:

无状态会话忽略 Cascade 选项,因此子节点不会自动持久化。我可以自己遍历集合,但是我无法设置关系,因为Parent_id列不存在作为我可以写入的属性。

我错过了什么吗?

0 投票
2 回答
4636 浏览

web-services - 没有会话的 HTTP 请求签名

我正在考虑一个休息网络服务,以确保发送给他的每个请求:

  • 该请求是由声称它的用户生成的;
  • 请求未被其他人修改(uri/method/content/date);
  • 对于 GET 请求,应该可以生成一个包含足够信息的 URI,以检查签名并设置到期日期。这样,用户可以在有限的时间段内将临时 READ 权限委托给协作者,使用生成的 URI 对资源进行访问。

客户端通过 id 和基于其密码的内容签名进行身份验证。

根本不应该有会话,所以服务器状态!服务器和客户端共享一个密钥(密码)

在考虑了它并与一些非常好的人交谈之后,似乎没有其他服务可以像我的用例那样简单地做到这一点。(HTTP Digest 和 OAuth 可以在服务器状态下做到这一点,而且非常健谈)

所以我想象了一个,我想请教各位大神对它应该如何设计的意见(我将发布它开源并希望它可以帮助其他人)。

该服务使用自定义“内容签名”标头来存储凭据。经过身份验证的请求应包含此标头:

请求在创建 10 分钟后失效。

例如,典型的 HTTP 请求将是:

服务器会回答:

或者

变量将是:

URI 参数

可以将一些参数添加到 URI(它们使标头信息超载):

  • _sras.content-signature=<METHOD>-<USERID>-<SIGNATURE> :将凭证放在 URI 中,而不是 HTTP 标头中。这允许用户共享已签名的请求;
  • _sras.date=Sun, 06 Nov 1994 08:49:37 GMT(请求日期*):创建请求的日期。
  • _sras.expires=Sun, 06 Nov 1994 08:49:37 GMT (expire date*) : 告诉服务器请求不应在指定日期之前过期

*日期格式:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18

感谢您的意见。

0 投票
3 回答
1893 浏览

nhibernate - 无法使用 NHibernate 批量插入

我尝试向我的应用程序添加批量插入,但 Batcher 仍然是 NonBatchingBatcher,BatchSize 为 1。

这是使用 C#3、NH3RC1 和 MySql 5.1

我已将此添加到我的 SessionFactory

我的代码很像这样

我正在为有问题的实例使用 HILO 身份生成,但不是为数据库上的所有实例。SessionFactory.OpenStatelessSession 没有类型,所以它不能真正知道它可以对这种类型进行批处理,或者......?

在深入研究 NHibernate 之后,我在 SettingsFactory.CreateBatcherFactory 中发现了一些可能会提供一些额外信息的东西

我的配置可能有问题吗?

0 投票
2 回答
1628 浏览

c# - 使用无状态会话延迟查找字典值

在我的应用程序中,我设置了一个三元字典映射,以便对于给定的用户,我可以检索属于该用户的对象的每个实例的“设置”。也就是说,我有类似的东西:

所以每当我有一个Baz对象时,我都可以通过currentUser.BazSettings[baz].

我希望能够使用无状态会话来执行此操作,但我得到了LazyInitializationException以下代码:

当我改用 anISession时,问题就消失了。

完整的 NHibernate 错误消息包括文本“没有会话或会话已关闭”。这是有道理的,因为在使用无状态会话时,实体不会连接到会话。但是,我认为有一种方法可以使用无状态会话来执行此查找。

如何使用无状态会话执行查找currentUser.BazSettings[baz]

0 投票
1 回答
77 浏览

authentication - 寻求输入:在没有任何服务器状态的情况下维护服务器会话

我不是安全专家,所以我正在寻找人们在我设计的身份验证方案中戳出巨大的漏洞,或者为我指出一个更好的现有方案来实现相同的目标:

问题概述

我有一个接口,客户端在其中维护会话生命周期(它是 Web 服务器上的 HTTP 会话,但这并不重要)。

无状态服务器提供了一些需要对调用者进行身份验证的服务(服务器具有执行此身份验证的能力)。

但是,希望服务器不必在每次调用时都对调用者进行身份验证,例如,通过在每次调用中传递凭据。(身份验证过程可能很昂贵。)

最好不要在服务器上维护会话状态。一方面,它只是要求一个脆弱的解决方案在客户端和服务器上都有独立的会话超时(客户端上的超时无法摆脱),并且服务器超时似乎是必要的,以便拥有可靠的会话生命周期在服务器上(而不是依赖客户端在适当的时间显式结束会话)。另一方面,服务器没有设置为存储这种状态。

服务器有一个明确的authenticate方法。那么问题来了:服务器如何验证,当调用另一个方法时,调用者之前已经使用该authenticate方法进行了身份验证,而不在服务器上存储任何会话状态?

建议的解决方案

这是我想出的一个方案:

authenticate方法接受凭据作为输入参数。成功认证后,服务器返回两件事:

  • 指示执行身份验证时间的时间戳。
  • { username, timestamp } 元组的加密版本,用私钥加密

在进一步的方法调用中,客户端将这两个值都传递回服务器。然后服务器解密加密的 { username, timestamp } 元组。如果解密的时间戳与客户端发送的未加密值匹配,则服务器知道客户端之前已经过身份验证(因为这是获取有效加密值的唯一方法)。解密后的用户名告诉服务器哪个用户已通过身份验证。

可以通过仅允许当前时间x小时内的时间戳来强制加密密钥的有效期。这与会话超时不同,但它限制了恶意方可以使用受损时间戳的窗口。

所以

我担心这个计划在十几个方面都是幼稚的。你看到了什么弱点或糟糕的逻辑?

0 投票
1 回答
1673 浏览

.net - 通过 NHibernate 使用无状态会话急切地获取曾孙集合

我正在使用 NHibernate 无状态会话将批量数据加载到数据库中。随着数据的加载,后面的实体需要查找以前的实体才能将它们添加到子集合中。此操作涉及需要有关孙对象的数据,而孙对象又需要可用的曾孙集合。

标准如下所示:

当我执行此操作时,由于会话的持久性上下文实体条目为空,因此TwoPhaseLoad会引发异常:InitializeEntity

加载器正在查找的实体是子实体。为什么持久性上下文条目映射在这里是空的?显然正在获取对象(生成正确的 SQL 并返回正确的结果),并且正确创建了“子”实体。为什么实体构造状态不正确?它是否与无状态会话在急切加载期间如何使用临时持久性上下文有关?

0 投票
1 回答
1001 浏览

multithreading - 无状态会话线程安全吗?

我知道 ISession 不是线程安全的。IStatelssSession 也不是线程安全的吗?我想答案是否定的。我进行了快速搜索,但没有找到相关参考。

谢谢。

0 投票
1 回答
979 浏览

nhibernate - 使用 NHibernate StatelessSession 时更新实体并忽略子代理

我正在尝试使用 StatelessSession 批量更新实体。

因为它是无状态的,NHibernate 不会在保存时自动级联子实体。

这很好,因为我不想对任何子实体进行任何更改。

不幸的是,保存后,NHibernate 抱怨:

“对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:MyAssembly.MyRandomEntity,实体:Castle.Proxies.MyRandomEntityProxy”

当然,如果我尝试更新子实体,我会收到错误消息:

“没有持久性:Castle.Proxies.MyRandomEntityProxy”

如您所见,子实体是一个代理,因为它尚未加载。我不需要它,我不想更新它……但即使我这样做了,我也不确定我该怎么做。

知道如何解决这个问题,基本上告诉它忽略瞬态子实体吗?

更新

这是父对象上子实体的映射:

这是子实体上的 Id 列:

0 投票
1 回答
980 浏览

nhibernate - 使用 Nhibernate 无状态会话更新子外键

我知道在使用无状态会话时,必须明确保存对象关联(子)

如果我有以下对象:

我修改了一个父实例并向其添加一个子实例,然后使用以下语句保存父子实例:

这样做会成功更新父记录并创建子记录,但是子表中的字段 Parent_Id 保持为空,因此不记录关联。

如何使用无状态会话手动记录关联?

0 投票
1 回答
2071 浏览

nhibernate - NHibernate 通过 StatelessSession 保存集合

我有 2 个类,它们在类中映射了彼此的多​​对多集合。

这是我的两个类的简化映射:

车辆:

区:

在我的程序中,我有 9600 个区域和 5000 辆车辆用于系统压力测试。每个区域当前映射到每个车辆,反之亦然,以模拟现实世界中的“更坏情况”场景。

我需要将此压力测试数据保存到数据库中,并且我遇到了几个问题,因为映射这两个列表的表在说和做时将包含 4800 万行。在现实世界中,一次保存所有项目的可能性非常小,但它仍然会发生。因此,我需要能够确保可以在任何给定时间保存这么多项目,即使我知道这将花费大量时间。

我知道对于批处理,建议使用无状态会话。但是,我读过无状态会话完全忽略了级联更新、继承和集合。由于我在提交调用期间收到堆栈溢出异常,因此目前无法使用无状态会话保存项目。

我的问题是这个。如果我先保存所有区域和车辆,以便对象保留在数据库中。是否可以通过无状态会话保存列表,如果可以,我将如何去做?如果没有,还有其他建议吗?我尝试使用 StatelessSession 的所有操作都导致 Collection 异常没有持久化。

编辑 我一直在使用常规会话跟踪保存这些对象。如果我在不同的会话和事务中将保存分成每 100 次保存,那么每次我在 Vehicle 上调用 SaveOrUpdate 时都会保存区域的所有其他属性。

有没有办法让它只保存列表而不接触车辆或区域对象本身?这似乎是我需要让最后一块工作。