4.6 session对象
session是一个网站所有页面都能访问的一个表格。这个表格只有两列,类似于这样:
每增加一个session数据,表格就多一行数据,行数并没有限制(如果内存足够的话)。数据都是以“名称-值”这样的对来保存的,读取的话,是根据名字来读取的。
下面这个是保存一对数据到session,名称是abc,值是123
| 名称 | 值 |
|---|---|
| abc | 123 |
| username | zhang |
<%@ 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取值,如果不存在,返回null | Stringvalue=(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由大家完成。主要完成:直接访问这两个页面就会显示未登录,或者直接跳回登录页面