Session是服务器端技术,服务器在运行时可以为每个用户的浏览器创建一个其独享的Session对象,由于Session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的资源放在各自的Session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的Session中取出数据为用户服务。
一、Session基础知识
1、工作原理:
Cookie类似于检查客户身上的“通行证”来确定客户身份的话,那么 Session 机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
2、实现方式。
1)通过 Cookie 实现——将Session的 ID 放入 Cookie。
A、Session 的实现需要使用Cookie作为识别标志。Session 不能依据 HTTP 连接判断是否为同一个客户,因此服务器向客户端发送一个名为JSESSIONID的 Cookie ,它的值为该Session的ID。Sessin依据该Cookie来识别是否为同一用户。
这边的JSESSIONID只是个名字,可以随便修改的。配置服务器的<Context sessionCookieName=" XXX ">设置。
B、该Cookie 为服务器自动生成的,它的 maxAge属性一般为 -1,表示仅当前浏览器内有效(包括字窗口),关闭浏览器失效,各浏览器不共享。
这会是一个问题,当你关闭浏览器,在重开,就会是另一个Cookie。解决办法:服务器在创建Session的时候回写一个同名的Cookie,并设置maxAge值即可,注意有path(见下图)
C、注意:第一次访问的时候,因为JSESSIONID是放在Cookie中,伴随浏览器访问传入,所以第一次访问的时候是没有的。request.getRequestedSessionId() 返回为空。这点在Firefox试验是没问题的。但是Chrome中会有出入。
Firefox在第一次访问的时候,请求信息中是没有 JSESSIONID数据的,请求结束,服务器返回。如下:
但是,Chrome在第一次访问的时候,请求中即会有一个临时的JSESSIONID,然后返回一个。如下:
问题:
有一种解释为:第一次访问的时候,在你的程序第一次访问服务器的时候,服务端并不知道你的客户端浏览器是否支持cookie,因此,当你第一次请求发起的时候,服务端会默认url重写,也就是将session id写到url中传递。
或者只是浏览器的支持问题?暂时没解决。
2)通过URL 重写实现——将Session的 ID 重写到URL地址中。
A、针对客户端不支持Cookie的情况,可以通过 URL 重写实现Session 。
B、response.encodeURL(String url)实现 URL 地址的重写。如果重定向可以这么写:response.sendRedirect(response.encodeRedirectURL("/"))
C、可以在服务器配置,取消重写的功能。配置Tomcat 的<Context disableURLRewriting="true">即可。
3、Session 的 创建
封装在javax.servlet.http.HttpSession 对象中,可以通过request.getSession()获取。
4、Session 的ID。
5、 Session 的时间。
1)有效期。
2)创建时间。
3)最近访问时间。
6、Session路径
Session 在客户端对应同一个窗口,没有路径访问问题,同一个servletContext 下的servlet/jsp共享同一个Session 。前提是同一个客户端窗口。
二、Session 的生命周期
1)Session在用户第一次访问服务器的时候自动创建。只有访问JSP、Servlet等程序才会创建Session(是访问到getSession()代码时), 只访问 HTML、 等静态资源并不会创建Session。 如果尚未生成Session ,也可以使用request.getSession(true)强制生成。
2)Session生成后,只要用户继续访问,服务器就会更新Session 的最后访问时间,并维护该 Session 。用户每访问服务器一次,无论是否读写 Session ,服务器都认为该用户的 Session “活跃(active)”了一次。
3)关闭浏览器,不会让 Session 结束,Session 是服务器管理的,只有当 session.invalidate() 代码或者配置好的有效时间<session-comfig>到了,Session 才会结束。
三、Session的常用方法。
四、测试代码如下:
【输出】
五、Session 和 Cookie 的比较。
1、从存取方式上比较:
1)Cookie 中只能存ASCII字符串,其他需要编码。不能直接存 java 对象。
2)Session 中可以存取任何类型的数据,直接保存JavaBean。
2、从隐私安全上比较
1)Cookie存储在客户端,会存在风险。所以一般一些敏感信息,如密码等尽量不要放入 Cookie,并且对Cookie 信息加密。提交到服务器在解密,保证安全性。
2)Session 存储在服务器,安全多了。
3、从有效期上比较
1)Cookie 的有效期只要设置Cookie 的maxAge即可。
2)Session 如果设置的有效期过长,会导致服务器累计的 Session 过多,导致内存溢出。
4、从对服务器负担上比较
1)Cookie无负担,所以比如大型的网站,电商等都会使用Cookie 追踪客户会话。
2)Session 过多就会影响服务器了。
总结:
当第一次访问一个Servlet、JSP等时,服务器会自动创建一个Session,同时将SessionId存在一个Cookie中,该Session默认时间是由服务器决定的,tomcat是30min,该Cookie的默认时间是-1,也就是浏览器关闭时,Cookie就销毁,所以会造成浏览器关闭Session即消失的错觉。