Java中会话pipe理的最佳select

用Javapipe理会话的最佳方法 我听说,cookies是不可靠的选项,因为他们被存储在浏览器中,可以稍后访问? 它是否正确? 如果可能的话,请拿出编码示例的答案。

其中最好的是:

  • URL重写 :服务器将在URL链接的末尾添加一个附加参数
  • 表单 :服务器中的隐藏参数将在HTML中的每个表单上添加一个附加参数
  • cookie :服务器会要求浏览器维护一个cookie。

会话pipe理(客户端标识,cookie处理,保存会话范围的数据等)基本上已经由应用服务器本身完成。 你根本不用担心。 您可以通过HttpSession#setAttribute()#getAttribute()在会话中设置/获取Java对象。 只有你真正需要处理的是客户端不支持cookies的情况下的URL重写 。 然后它会将一个jsessionid标识符附加到URL中。 在JSP中,您可以使用JSTL的c:url 。 在Servlet中,你可以使用HttpServletResponse#encodeURL()来实现。 这样服务器就可以通过读取新的请求URL来识别客户端。

你的新问题可能是“但是,cookies怎么与这个有关呢?服务器是怎么做的呢?” 那么,答案是这样的:如果服务器接收到来自客户端的请求,并且服务器端代码(您的代码)试图通过HttpServletRequest#getSession()获取HttpSession ,而尚未创build任何人(新鲜会话中的第一个请求),服务器将自己创build一个新的。 服务器将生成一个长而唯一的,难以猜测的ID(可以通过HttpSession#getId() ),并将该ID设置为名为jsessionid的cookie的值。 在服务器端,服务器HttpServletResponse#addCookie()使用HttpServletResponse#addCookie() 。 最后,服务器将所有的会话存储在某种Map ,会话ID为key, HttpSession为value。

根据HTTP cookie规范 ,客户端需要将相同的cookies发回到后续请求的头部。 在引擎盖下,服务器将通过HttpServletRequest#getCookies()searchjsessionid cookie并确定它的值。 这样服务器就可以获取关联的HttpSession并通过HttpServletRequest#getSession()每次调用将其返回。

关键点:存储在客户端的唯一东西是会话ID(在cookie的味道中), HttpSession对象(包括它的所有属性)存储在服务器端(在Java的内存中)。 您不必担心会话pipe理本身,也无需担心安全问题。

也可以看看:

  • 通过在Java中使用filtervalidation用户名和密码(与数据库联系)
  • 如何在Java Web应用程序中Session过期时redirect到Login页面?
  • 当用户login到Web应用程序时如何实现“保持login状态”

所有Java Web框架都支持Cookie或URL编码的会话ID。 他们会自动select正确的方法,所以你不需要做任何事情。 只需从容器中请求会话对象,它将处理细节。

[编辑]有两种select:Cookie和一个特殊的URL。 这两种方法都有问题。 例如,如果您使用URL编码会话,则可以尝试传递会话(例如,通过将URL放入邮件中)。 如果你想了解这一点,请阅读一些关于安全性和构build应用程序服务器的文章。 否则:您的Java应用程序服务器将为您做正确的事情。 别想了。

Cookie只存储会话ID,一旦会话过期,这个ID就没用了。

Servlet规范定义了用于在标准J2EE应用程序中访问/设置会话数据的API。 它还定义了会话数据存储在服务器端,除会话标识符之外没有任何内容被传送到客户端。 有两种机制如何传输会话ID:

1)请求URL例如jessionid = ….
2)cookie

机制是根据客户端function自动确定的。

编辑 。 没有最好的select,有定义方式的servlet规范。

Http是一个无状态的客户端拉唯一协议。

为了实现有状态的对话,Java EE Web Server需要在客户端隐藏一些信息(sessionid),它可以使用的机制应该遵循HTTP和HTML规范。

有三种方法可以实现这个目标:

  1. URL重写 :服务器将在URL链接的末尾添加一个附加参数。
  2. 表单 :服务器中的隐藏参数将在HTML中的每个表单上添加一个附加参数。
  3. cookie :服务器会要求浏览器维护一个cookie。

基本上,现代Web服务器将有一个“filter”来select自动使用的方式。
所以如果服务器检测到浏览器已经closures了cookie的支持,它会切换到其他方式。

2个重要问题:

  1. 你使用哪种networking技术? JSF,Struts,SpringMVC或者简单的servlet / JSP。

    • Servlets / JSP已经为您提供了所需的会话支持。
      JSP示例: Hello, <%= session.getAttribute( "theName" ) %>

    • 我真的不认为你有什么担心cookies,因为数据安全地存储在服务器中,并且处理cookie是自动完成的。

  2. 您的应用程序是否安装在单个服务器上?

    • 如果YES没有问题,请使用servlet会话选项。

    • 如果没有比你要find另一种方式来做到这一点。 就像使用粘性会话一样,或者可以将请求/响应中的整个会话对象parsing为一个字段。 这个选项的确需要你采取安全措施。