我在不使用会话和不使用 cookie 的情况下访问用户信息时遇到问题。如何在没有会话和没有 cookie 的情况下管理用户信息?请帮忙
4 回答
假设您正在谈论 Web 浏览器和 HTTP:您不能。
HTTP 是一种无状态协议。用服务器端状态来重载它需要一些唯一标识请求者的方法。Cookie 是 Web 浏览器维护客户端状态的唯一方式。
[编辑注释]然而,我应该指出,可以想象在 URI 中嵌入有限数量的状态数据,作为 URI 的查询或片段部分的一部分。它是有限的,因为大多数(每个?)实现都对 URI 的最大长度施加了某种限制。此外,您的 Web 应用程序将需要确保状态数据从 URL 正确传播到 URL。为了安全起见,它应该被加密,以免 URI-twiddling 让您的网站被破解。
您可以使用 MySQL 数据库来存储用户信息。不幸的是,如果不使用会话变量,您将不得不在 url 变量中传递用户的凭据,例如 ?username=dave password=cat (请不要这样做),或者您只需要了解一些有关安全性和以正确的方式做事(首选)。
这似乎是一个不必要的要求下面的警告,但我会试一试。
当用户登录时,向他们颁发一个安全令牌。将该令牌存储在数据库中。令牌应包含任意值(例如十六进制编码的 GUID),而不是名称或密码。数据库还存储令牌和实际用户 ID 之间的关系。令牌应该有一个到期日期。
将令牌与每个请求一起作为 URL 的一部分传递(ASP.Net 为无 cookie 会话执行此操作)。由于您不想使用会话状态,因此您必须将与用户相关的任何信息存储在其他地方,可能是数据库。每个页面上的每个 URL 都需要有令牌。
您还可以利用Web 浏览器中的本地存储来存储非安全信息。
在 ASP.Net 中,会话在某些情况下是不切实际的,即使对于非常轻量级的对象也是如此。这是因为会话访问是如何序列化的;假设您有一个仪表板页面,其中充满了向需要了解会话相关信息的 WCF 端点发出请求的小部件。如果该端点使用会话状态,性能将受到影响,因为每个请求都将连续执行。
...如果对同一个会话发出两个并发请求(通过使用相同的 SessionID 值),第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。
http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx
每个页面上的隐藏输入都可以做到这一点,但是您将无法使用 POST 而不是 GET。这是非常不推荐的。