在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。


 

设置Session超时时间方式:

方式一:
  在web.xml中设置session-config如下:
  <session-config>
   <session-timeout>2</session-timeout>
  </session-config>


 
 即客户端连续两次与服务器交互间隔时间最长为2分钟,2分钟后session.getAttribute()获取的值为空
 

API信息:
   session.getCreationTime()   获取session的创建时间
   session.getLastAccessedTime()  获取上次与服务器交互时间
   session.getMaxInactiveInterval() 获取session最大的不活动的间隔时间,以秒为单位120秒。
   
 方式二:
  在Tomcat的/conf/web.xml中session-config,默认值为:30分钟
  <session-config>
         <session-timeout>30</session-timeout>
     </session-config>
  
 方式三:
  在Servlet中设置
   HttpSession session = request.getSession();
   session.setMaxInactiveInterval(60);//单位为秒

说明:
 1.优先级:Servlet中API设置 > 程序/web.xml设置 > Tomcat/conf/web.xml设置
 2.若访问服务器session超时了(本次访问与上次访问时间间隔大于session最大的不活动的间隔时间),即上次会话结束。服务器与客户端会产生一个新的会话,之前的session里的属性值全部丢失,产生新的sesssionId。

 3.客户端与服务器一次有效会话(session没有超时),每次访问sessionId相同。
 4.Session的销毁(代表会话周期的结束):调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁。
 5.对于JSP,如果指定了<%@ page session="false"%>,则在JSP中无法直接访问内置的session变量,同时也不会主动创建session,因为此时JSP未自动执行request.getSession()操作获取session。

 

总结:

       在程序开发过程中,我们可以在客户端每次与服务器交互时检查SessionID(Session中属性值,非HttpServlet环境开发中也可以用其它的Key值代替),用于会话管理。

<浏览器关闭问题:cookies默认保存在浏览器,且关闭浏览器后销毁。如果设置了过期时间及保存路径,就会持久化一定时间。浏览器只与sessionId有关,与Session无关。>

销毁session。也可以设置过期时间>

相对于cookie,session更安全,保存的数据量更大,保存的数据类型更丰富。但是,相对于cookie将状态写在客户端,session会将状态保存在服务器端,服务器的数据压力会更大。另外,session默认情况下,会将sessionId保存在浏览器对应的内存空间里面,如果关闭浏览器,session会失效(注意:是失效,不是销毁。因为没有sessionId,对应的session也就找不回来了)。所以,对于比较复杂的状态管理问题,我们会同时使用cookie和session。
session的几个常用的方法

String session.getId(); //返回sessionId
 session.setAttribute(String name,Object obj); //绑订一个对象到session。
Object session.getAttribute(String name); //依据绑订名找到绑订值,注意有可能返回null。
session.removeAttribute(String name); //解除绑订

如果关闭浏览器还想获得原来浏览器里的数据 可以将数据保存到cookie上:
CookieUtil.addCookie("cart", cart.store(), response);

public class CookieUtil {
private static int age = 3600 * 24;  //缺省的生存时间
private static String path = "/shoppingcart02"; //应用名,如果要将该工具用在其它的应用当中,需要修改这个值。

/**


public static void addCookie(String name,String value,int age,HttpServletResponse response) throws UnsupportedEncodingException{
Cookie c = new Cookie(name,
URLEncoder.encode(value,"utf-8"));
c.setMaxAge(age);
c.setPath(path);
response.addCookie(c);
} 
//从cookie中取出数据
/**


 * @throws UnsupportedEncodingException 
 */
public static String findCookie(String name,HttpServletRequest request) throws UnsupportedEncodingException{
String value = null;
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i=0;i<cookies.length;i++){
Cookie c = cookies[i];
if(c.getName().equals(name)){
value = URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
return value;
}
}