一个HttpSession对应同一个客户端发送的多个Request。
一、SessionID
服务器通过SessionID来识别request是否来自同一个客户端。当第一次收到客户端发来的Requst时,Container会生成一个SessionID并随response发回客户端,当客户端发送随后的请求时将SessionID一同发送到服务器,Container将收到的SessionID与现存Session的SessionID进行匹配。
1、Cookies
Cookies是一种简单的发送SessionID的方法。当Container通过Cookies发送ID时,response header中会有Set-Cookie:JSESSIONID=1231231项,客户发回的request header中也会有Cookie:JSESSIONID=1231231项。
使用HttpRequest.getSession()会自动在response中加入Cookie:JSESSIONID,使用HttpSession.isNew()可以判断得到的Session是否是新的,当该Session中无匹配ID时视为新的,返回true。当想要获得旧的Session时,可以用HttpRequest.getSession(false),如果没有旧的Session则返回null。
除了通过HttpRequest得到Session外,事件类SessionEvent中也有getSession()方法,所以通过SessionEvent及其子类SessionBindingEvent均可得到HttpSession,而Even class常出现在Listener的方法中。
2、URL Rewriting
当客户端不接受Cookie时,会忽略response header中的Set-Cookie项,因此无法用Cookie传送JSESSIONID。
URL Rewriting在URL后附加JSESSIONID,response.encodeURL("URLstring"). URL Rewriting为备用方式,当Cookie可用时container优先使用cookie。
与sendRedirect()合用,sendRedirect(response.encodeURL("URLString"));
二、结束Session
当使用response.getSession()时会得到一个implements HttpSession 的Object,其实例化由container实现。 HttpSession中的setMaxInactiveInterval(int time)方法可以设置两次request的最大间隔时间(以秒为单位),超过时限则结束session。invalidate()方法直接结束session。也可以在web.xml中为所有session设置两次request的最大间隔时间,与setMaxInactiveInterval(int time)效果相同,但是以分钟为单位。
...
15
Cookie是客户端和服务器之间交换的name/value对,其中name/value都是String类型。服务器向客户端发送cookie,客户端收到cookie后在随后的每次请求中都发送该cookie
默认情况下Session结束后Cookie也随之失效,但是可以设置Cookie使之在客户端上保存一定时间。
与Cookie有关的API:
HttpServletRequest.getCookies();HttpServletResponse.addCookies();以及javax.servlet.http.Cookie
//创建一个Cookie
Cookie cookie = new Cookie("StringName","StringValue");
//设置cookie在客户端的保存时长,以秒为单位,设为-1时随session结束马上失效
cookie.setMaxAge(intSeconds);
//向客户端发送cookie
response.addCookie(cookie);
//得到Cookies,注意只有得到Cookie Array的方法,没有得到Cookie的方法
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals(“username”)) {
String userName = cookie.getValue();
out.println(“Hello “ + userName);
break;
}
}
几个关键的时刻:Session创建,Session失效,Session Attribute被替换、移除(removeAttribute())或者增加新Attribute;在分布式app中,session可能从一个JVM传递到另一个JVM,在传递之前,Session会在当前JVM中钝化,在传递到目标JVM后,Session激活。
相关的Listener:
Session创建,Session失效:HttpSessionListener(HttpSessionEvent)
Session Attribute被替换、移除(removeAttribute())或者增加新Attribute:HttpSessionAttributeListener(HttpSessionBindingEvent)
在传递之前,Session会在当前JVM中钝化,在传递到目标JVM后,Session激活:HttpSessionActivationListener(HttpSessionEvent)
:HttpSessionActivationListener与HttpSessionBindingListener一样可以被Attribute class implements。
HttpSessionEvent.getSession()
HttpSessionBindingEvent.getSession();HttpSessionBindingEvent.getValue()返回触发事件的Attribute的值,当然返回的只能是事件发生之前的值。 HttpSessionBindingEvent.getName()返回触发事件的Attribute的名字。