4.6 session对象

session是一个网站所有页面都能访问的一个表格。这个表格只有两列,类似于这样:
名称

abc
123
username
zhang
每增加一个session数据,表格就多一行数据,行数并没有限制(如果内存足够的话)。数据都是以“名称-值”这样的对来保存的,读取的话,是根据名字来读取的。 下面这个是保存一对数据到session,名称是abc,值是123
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<% session.setAttribute( "abc" , "123" );%>
以下是从session中读取名称为"abc"session可以直接保存对象,全部以Object类型保存,读取出来的时候,需要把Object类型转换成对应的类型才能使用。在一个页面保存一条session数据,可以在其余页面读取。
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<% String value=(String)session.getAttribute( "abc" );%>
session值是会定期清除的,例如session经常用来保存用户的登陆状态,如果超过一定时间没有操作,那么session清空,这个账户就是未登录状态了。我们可以通过这个函数session.setMaxInactiveInterval(arg0),来修改超时的时间,以毫秒为单位。
例如要定30分钟超时,那么就是session.setMaxInactiveInterval(30*60*1000)。 session是和用户相关联的,例如同时有两个人使用网站,就会生成两个不同的session对象,它们互不干涉。这个过程是容器(tomcat)来做的,对我们开发者来说是透明的。
如果要手动删除掉本用户关联的所有session,那么使用这个方法:session.invalidate()。 
如果只是session的某行数据要删除掉,那么就要用session.removeAttribute(Stringname),例如登出(退出)操作(点击后删除用户登录的session值)
返回类型
方法名
功能
示例
void
setAttribute(Stringname,Objectvalue)
保存一条数据到session,名字是name,值是value,如果已经有同名数据存在,那么它的值会被覆盖
session.setAttribute("abc","123");
Object
getAttribute(Stringname)按照名字name从session取值,如果不存在,返回nullStringvalue=(String)session.getAttribute("abc");
void
setMaxInactiveInterval(inttime)设置session超时时间
session.setMaxInactiveInterval(30*60*1000)
void
invalidate()将session失效,删除所有sesison数据
session.invalidate()
void
removeAttribute(Stringname)
根据名字删除session的某行数据
session.removeAttribute("abc");

以下是具体的登录以及保存登录状态的例子,首先是登录页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="get" action="a23456.jsp">
账号 <input type="text" class="inputText" name="username" width="120px"><br />
密码 <input type="password" class="inputText" name="password"
width="120px"><br /> <input value="登陆" type="submit"
class="submit">
</form>
</body>
</html>

然后是处理登录的页面
<%@ page language="java" contentType="text/html ;charset=UTF-8" pageEncoding="UTF-8" import="db.*"%>
<%
//取得发送过来的用户名
String username=request.getParameter("username");
//取得发送过来的密码
String psw=request.getParameter("password");
out.println(username);
out.println(psw);

if(UserData.userValidate(username, psw)){
out.println(UserData.getNicknameByUsername(username)+"登录成功");

session.setAttribute("nickname", UserData.getNicknameByUsername(username));
session.setAttribute("username", username);
response.sendRedirect("readSession.jsp");
}else{
out.println("登录失败");
}
%>

第14、15行就是把登陆状态(用户名和昵称保存到session)
接下来是readSession.jsp,在第12行从session读取昵称,并根据nickname这个变量判断是否已经登录:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String nickname=(String)session.getAttribute("nickname");
if(nickname==null){
out.println("未登录!");
out.println("<a href='index.html'>登录</a>");
}
else{
out.println("欢迎,"+nickname);
out.println("<a href='changeNickname.jsp'>修改昵称</a>");
out.println("<a href='changePassword.jsp'>修改密码</a>");
}
%>
</body>
</html>

剩下的changeNickname.jsp和changePassword.jsp由大家完成。主要完成:直接访问这两个页面就会显示未登录,或者直接跳回登录页面