Session的理解
灵感来源于:https://www.cnblogs.com/lixinjie/p/a-yuanfen-between-session-and-me.html
在登陆时,request.getSession().setAttribute("userName", "lixinjie"),request.getSession().setAttribute("nickName", "李大胖")等。
在程序中如果要使用的话,是这样的request.getSession().getAttribute("nickName")等。
在登出时,是这样的request.getSession().removeAttribute("userName"),request.getSession().removeAttribute("nickName")等,终于知道用remove了。
来分析一下。在代码中是这样获取session的,request.getSession(),这个方法的意思是当有session时就返回session,当没有时就创建一个新的session再返回
1.Session是由tomcat(Servlet容器)创建的,驻留在内存里,每个Session都有一个唯一的Id标识,叫做session id。当用户登陆时,这个session id会被服务器写到cookie里传回客户端。
下次这个客户端再发起请求时就会把这个cookie带上,tomcat从cookie里解析出session id,然后去自己的所有session里找,如果找到session说明他已经登陆过了,反之则没有,要求他去登陆。
2.Servlet已经涵盖了JSP技术,因为JSP最终也会被编译为Servlet,两者有着相同的本质。
3.Session创建的时间是: 一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。 由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。 4.Session删除的时间是: 1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。 2)程序调用HttpSession.invalidate() 3)服务器关闭或服务停止 5.session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理。 6.session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。一个会话只能有一个session对象, Session共享的几种方案解决方案一:基于Tomcat的session复制
这个解决方案其实就是当用户请求的时候,把产生的sessionID给复制到系统所有的服务器中,这样就能保证当用户请求的时候从服务器A可能调用到服务器B上的模块的时候,也能保证服务B也有该用户的sessionID,这样就不会再次让用户进行再次登录操作了。也就解决问题了。
具体代码中如何实现session复制呢?
使用session复制的优缺点:
---------------------
解决方案二:Spring Session基于Redis做session统一缓存
Spring session设计思路:替换掉Servlet容器创建和管理HttpSession的实现
遇到过的我问题:
随后与客户联系发现,网络中有一个Nginx把cookie过滤掉了。所以请求到达服务器端根本就没了cookie,所以不可能找到session,因此只能创建新的session了。
因客户的网络很难调整,幸运的是spring session支持把session id放入header中传输,至此问题得以解决。
spring session支持多种session的存储介质,当然用的最多的应该还是redis。大家都知道长时间不操作的话session是会过期的。我们第一个想到的就是redis的key也支持过期时 间啊。
只要把session的过期时间设置成redis的TTL,在访问session时更新这个TTL就行了。当你不访问时,TTL逐渐减少到0,key过期,session也就过期了,看似很不错。

使用Redis实现session共享的优缺点:
