2013-06-19 31 views
0

我正在使用JSF 2.0,这已经有一段时间了,因为我一直在寻找加密的cookie作为会话的替代方案。我听说“ASP.NET MVC 4”中有这样的内容。JSF 2:使用Cookie而不是会话是一种好的做法吗?

所以问题是:有什么方法可以使用cookie而不是会话来存储数据在 JSF 2.0?如果答案是肯定的,那么这是一种好的做法吗?

我感谢您的意见。

+0

Cookie的一个主要缺点是用户可能会禁用它们。除了企业环境(您可以控制客户端配置)外,我不会尝试使用它们(除非没有其他选择)您的web应用程序的基本逻辑。 – SJuan76

回答

3

如果您使用的是setAttributegetAttribute HttpSession中,这就是你想与cookies来取代,(大概是为了节省服务器的内存)的东西,那么你可以很容易地使用HttpServletResponse.addCookieHttpServletRequest.getCookies保存数据的cookie。

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

  1. 如果您经常更新会话中的值,请记住,您将发送更新后的cookie以及对浏览器的每个响应。这将增加响应的大小。
  2. Cookie存储在客户端,因此它们也可以被用户操纵。根据您的使用情况,这可能会在您的应用程序中引入安全漏洞
  3. Cookie可能具有比会话更大的生命周期。这可能是有用的,取决于你存储在你的cookies中。
  4. 使用cookie可以让Javascript访问这些值,如果你使用它的话可以使用它。但它也为您打开跨站脚本。
  5. Cookie可以被用户和组织禁用。因此,取决于您的用户是谁,如果您依赖现有的数据,这可能会破坏您的应用程序。
+0

+1感谢您的快速响应。有没有内置的方法来保存cookies加密? –

+0

不,你必须加密和解密服务器端的cookies。但是如果你对所有的cookies使用相同的盐,一个坚定的黑客最终可能会绕过你的加密。一种解决方案可能是为每个用户甚至每个会话使用不同的盐。 –

+0

此外,请考虑安全Cookie。它们只通过HTTPS连接传输。 –

0

使用Cookie的方式是这样的一个:

写入一个cookie:

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

读取cookie的

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

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

0

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

+0

感谢您的回复:) –

相关问题