【问题标题】:JSF 2: Is it a good practice to use cookies instead of session? [closed]JSF 2:使用 cookie 代替会话是一种好习惯吗? [关闭]
【发布时间】:2013-06-15 19:28:08
【问题描述】:

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

所以问题是:有什么方法可以使用 cookie 代替 session 来存储数据 JSF 2.0?如果答案是肯定的,这是一个好习惯吗?

感谢您的 cmets。

【问题讨论】:

  • cookie 的主要缺点之一是用户可能会禁用它们。我不会尝试将它们(除非没有其他选择)用于企业环境之外的 web 应用程序的基本逻辑(您可以在其中控制客户端配置)。

标签: java jsf session jsf-2 session-cookies


【解决方案1】:

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

【讨论】:

  • 感谢您的回复 :)
【解决方案2】:

如果您正在使用 setAttributegetAttribute HttpSession 并且这就是您想用 cookie 替换的内容(可能是为了节省服务器内存),那么您可以使用 HttpServletResponse.addCookieHttpServletRequest.getCookies.

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

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

【讨论】:

  • +1 感谢您的快速回复。是否有任何内置方法可以保存加密的 cookie?
  • 不,您必须在服务器端加密和解密 cookie。但是,如果您对所有 cookie 使用相同的盐,那么坚定的黑客最终可能会绕过您的加密。一种解决方案可能是为每个用户甚至每个会话使用不同的盐。
  • 另外,考虑安全 cookie。它们仅通过 HTTPS 连接传输。
【解决方案3】:

cookies的使用方式是这样的:

写入 cookie:

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

读取 cookie

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

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

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2015-02-18
    • 2016-03-20
    • 2018-12-12
    • 2021-12-10
    • 2017-04-28
    • 2020-08-25
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多