0

我正在使用 JSF 2.0,自从我一直在搜索加密的 cookie 作为会话的替代方案以来已经有一段时间了。我听说“ASP.NET MVC 4”中有这样的东西。

所以问题是:在 JSF 2.0 中是否有任何方法可以使用 cookie 而不是 session 来存储数据?如果答案是肯定的,这是一个好习惯吗?

我很欣赏你的评论。

4

3 回答 3

3

如果您正在使用setAttributeand getAttributeHttpSession 并且这就是您想用 cookie 替换的内容(大概是为了节省服务器内存),那么您可以使用HttpServletResponse.addCookieand轻松将该数据保存到 cookie 中HttpServletRequest.getCookies

现在这是否是一个好主意,取决于您的用例。

  1. 如果您经常更新会话中的值,请记住您将在每次响应浏览器时发送更新的 cookie。这将增加响应的大小。
  2. Cookies 存储在客户端,因此它们也可以被用户操作。根据您的使用情况,这可能会在您的应用程序中引入安全漏洞
  3. Cookie 的生命周期可以大于会话。这可能很有用,具体取决于您在 cookie 中存储的内容。
  4. 使用 cookie 允许 Javascript 访问这些值,如果您使用它会很好。但它也为您打开了跨站点脚本的大门。
  5. 用户和组织可以禁用 Cookie。因此,根据您的用户是谁,如果您依赖那里存在的数据,这可能会破坏您的应用程序。
于 2013-06-19T10:13:13.493 回答
0

使用cookies的方法是这样的:

写入 cookie:

FacesContext.getCurrentInstance()
 .getExternalContext()
 .addResponseCookie("CookieName", "value", null);

读取 cookie

Map<String, Object> requestCookieMap = FacesContext.getCurrentInstance()
   .getExternalContext()
   .getRequestCookieMap();

我认为没有“最佳实践”,您应该只考虑 JSF 以广泛的方式使用会话,因此风险在于您的会话规模很大。Cookies 可以帮助您避免过大的会话。

于 2013-06-19T10:19:04.473 回答
0

Cookie 是网络的重要组成部分,但通常我会尽量避免将它们用于会话管理之外的任何事情。如果您不想将用户会话存储在服务器上,请使用客户端状态保存。您需要使任何会话对象可序列化,但大概您正在做类似的事情以将状态存储在 cookie 中。除非您的服务器内存非常有限,否则我会坚持使用服务器端会话存储,因为它可以节省带宽。

于 2013-06-19T12:32:21.153 回答