session对象
session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
当客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
session对象是HttpSession类的实例。
常用方法:
public void setAttribute(Sting name, Object value),设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。
public Object getAttribute(String name),在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。
public void removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。
public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。
public String getId( ),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
public void setMaxInactiveInterval(int interval),设置会话的最大持续时间,单位是秒,负数表明会话永不失效。
public int getMaxInActiveInterval(),获取会话的最大持续时间。
使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。
Date creationTime = new Date(session.getCreationTime());
Date accessedTime = new Date(session.getLastAccessedTime());
实例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="java.text.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'session_page_1.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>session内置对象</h1>
<hr>
<%SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH:MM:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("password","12345");
session.setAttribute("username","admin");%>
Session创建时间:<%=sdf.format(d) %><br>
Session的ID:<%=session.getId() %><br>
从Session中获取用户名:<%=session.getAttribute("username") %><br>
<%
// 设置当前session最大生成期限,单位秒
//session.setMaxInactiveInterval(10);%>
<%
//销毁session
//session.invalidate(); %>
<a href="session_page_2.jsp" target="_blank">跳转到Session_page_2.jsp页面</a>
</body>
</html>
session_page_2.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'session_page_2.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
Session的ID:<%=session.getId() %><br>
从Session中获取用户名:<%=session.getAttribute("username") %><br>
Session中保存的属性有:<%
for(int i = 0 ; i < session.getValueNames().length;i++){
out.println(session.getValueNames()[i]);
out.println("  ");
}
%>
</body>
</html>
Session的生命周期:
- 创建:
当客户第一次访问某个jsp或者servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务器发送请求时,都会将此SessionId携带过去,服务器端会对此SessionId进行校验。 - 活动:
某次会话当中通过超链接打开的新页面属于同一会话。
只要当前会话没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一会话。
除非本次会话的所有页面都关闭后再重新访问某个jsp或servlet将会创建新的会话。
注意:注意原有会话还存在只是这个旧的SessionId仍然存在于服务器,只不过再也没有客户端会携带它然后交予服务器校验。 - 销毁:
a.调用Session.invalidate();
b.session过期(超时)
tomcat默认超时时间30分钟
1.session.setMaxInactiveInterval(时间);//单位秒
2.在web.xml配置:
- 创建:
<session-config>
<session-timeout>10
</session-timeout>
</session-config>//单位分钟
c.服务器重新启动