【译】StackOverflow:java中管理session的最好方式

这篇文章来自于StackOverflow中的问答,主要讨论了web服务器会话管理的原理。
原文

问题:Java中管理session的最好方式

我听说在浏览器中通过cookies存储信息并且稍后读取并不是一个很好的方式?这是正确的吗?如果可以请给出答案,并附上代码。
在下面三者当中哪一个是最好的:

  • URL 重写:服务端在URL连接后面附着上额外的参数
  • 在Form表单中使用隐藏域:服务端会在HTML中的每个表单内增加额外的参数
  • cookie:服务端会要求浏览器维护cookie

回答:

服务端web应用基本上已经处理好了Session管理(客户端识别、cookie处理、保存session作用域数据等等),你不需要去担心这所有的问题。你仅仅需要通过HttpSession#setAttribute#getAttrubute方法set/get Java对象到session中即可。你唯一需要担心的是为那些不支持cookies或将cookies功能关闭的客户端做URL重写工作(URL rewriting),这需要在URL后面添加一个jsessionid标识。在JSP中你可以使用JSTL的c:url做URL重写。在Servlet中你可以使用HttpServletResponse#encodeURL()方法做URL重写。这样服务端可以通过读取识别新请求的URL中sessionid信息识别客户端。
接下来你的新问题可能要来了“但是cookies是怎样关联的这些?server是怎样做到所有的事情呢?”好的,答案就是:当服务器接收到一个从客户端发来的请求并且在服务端代码(你的代码)中尝试通过HttpServletRequest#getSession()方法得到HttpSession对象,如果没有一个已经被创建的HttpSession实例(在一个新会话的第一次请求),服务端自己将会创建一个新的HttpSession实例对象。服务端将会生成一个长的、独一无二、很难去猜测的ID(你可以通过HttpSession#getId()方法获取这个ID),并且将这个ID作为值设置到以jsessionid命名的cookie中,接下来服务端使用HttpServletResponse#addCookie方法将这个特殊的cookie设置到响应中,最后,服务端将这些session实例保存到一个以session ID作为键,以HttpSession实例作为值的Map中。
根据HTTP cookie规范,在后续的请求中客户端被要求在请求中发送回服务端这个具有jsessionid的cookies信息,接下来服务端将会通过HttpServletRequest#getCookies()方法寻找具有jsessionid的cookie并且获取到cookie中的值。这样服务端就可以获得同一客户端浏览器实例相关的HttpSession,并且可以调用HttpServletRquest#getSession()方法获取他.
重要的是:保存到客户端的是session ID(保存到cookie中的),HttpSession对象(包括他的所有属性(attributes))被保存到服务端(的内存中),而不是客户端。你不需要自己担心session管理问题,你也不需要担心安全问题。
这是自己第一次翻译,自己也认为这是一次很好的尝试,锻炼了自己多方面的能力,并且还可以与大家来分享。如果翻译有错误、不好的或者模棱两可的地方,请指出。

你可能感兴趣的:(【译】StackOverflow:java中管理session的最好方式)