Session management

一个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的其他应用

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失效,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的名字。

你可能感兴趣的:(Session management)