HTTP协议是无状态的,即信息无法通过HTTP协议本身进传递。为了跟踪用户的操作状态,JSP使用一个叫HttpSession的对象实现用户状态的保存。session在第一个JSP页面被装载的时候自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器通过session对象来区分是哪个客户。
表6-16 Session对象常用方法
方法名 描 述
- public String getId() 取得session id;
- public long getCreationTime() 取得session的创建时间 ;
- public long getLastAccessedTime() 取得session的最后一次操作时间;
- public boolean isNew() 判断是否是新的session(新用户);
- public void invalidate() 让session失效 ;
- Void removeAttribute(String name) 删除指定属性的属性值和属性名;
- int getMaxInactiveInterval() 获取Session对象的生存时间
- Void setAttribute(String name,Object obj) 设定指定名字的属性
- object getAttribute(String name) 返回session对象中存储的每一个属性对象
- public Enumeration getAttributeNames() 得到全部属性的名称
说明:
-
Session的信息保存在服务器端,Session的id保存在客户机的cookie中。
-
Session一般在服务器上设置了一个30分钟的过期时间,当客户停止活动后自动失效。
-
Session 中保存和检索的信息不能是基本数据类型如 int, double等,而必须是java的相应的对象,如Integer, Double。
session.setAttribute(“price”, 10);
int x=((Integer)session.getAttribute(“price”)).intValue();
【案例】继续修改登录功能。利用session实现登陆成功在每个页面都显示当前在线的用户名,实现网站页面的访问限制,现用户注销和用户长时间不操作页面自动失效的功能。
具体实现步骤:
第一步:修改check.jsp,登陆成功时把用户名保存到session。
if(“admin”.equals(name.trim())&&“123456”.equals(pwd)){
//第一步创建cookie对象
Cookie cookie1=new Cookie(“username”,name);
Cookie cookie2=new Cookie(“password”,pwd);
//第二部设置Cookie有效期
cookie1.setMaxAge(72460*60);
//弟三歩写cookie
response.addCookie(cookie1);
response.addCookie(cookie2);
session.setAttribute(“username”, name);
%>
<jsp:forward page=“success.jsp”>
<jsp:param value=“naike” name=“good”/></jsp:forward>
<%}
第二步:在成功页面读取session中保存的用户信息
String name=(String)session.getAttribute(“username”);
第三步:实现页面的访问限制
新建validate.jsp页面,实现登录验证,在,每个页面中把它包含进来,注意需要用静态包含
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%String name=(String)session.getAttribute("username");
if(name==null||name.isEmpty() ){
response.sendRedirect("fail.jsp");
}
%>
</body>
</html>
Success.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%@include file="validate.jsp"%>
<%
//int Integer double Double
//session.setAttribute("price", 10);
//int x=((Integer)session.getAttribute("price")).intValue();
//System.out.print(x);
request.setCharacterEncoding("utf-8");
//String name=request.getParameter("username");
String good=request.getParameter("good");
%>
<%=name %>购买了<%=good %>登陆成功
<a href="cloth.jsp">衣服</a>
<a href="loginout.jsp">注销</a>
</body>
</html>
第四步:设置session的有效期,在check.jsp中添加如下代码:
session.setMaxInactiveInterval(60*10);
第五步实现用户注销,success.jsp中添加如下代码
<a href="loginout.jsp">注销</a>
Loginout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.invalidate();
response.sendRedirect("fail.jsp");
%>
</body>
</html>
【案例】利用session实现购物车的功能
思路解析: session : 多个商品:集合类 List Set HashMap
ArrayList 篮子
第一次购物:
ArrayList car=new ArrayList();
Car.add(good);
Session.setAttibute(“car”,car);
第>=1次购物:
car=session.getAttribute(“car”);
car.add(good);
Session.setAttibute(“car”,car);
具体实现步骤:
第一步:购物页面buy.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>
<title>My JSP 'buy.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>
<table>
<tr><td>商品名称</td><td>商品单价</td><td>购买</td></tr>
<form action="addCar.jsp" method="post">
<tr><td>手机</td><td>2000</td><td><input type="submit" name="buy" value="购买"/></td></tr>
<!-- 表单中通过隐藏域把参数偷偷传给服务器的目标页面 -->
<input type="hidden" name="goodname" value="手机"/>
<input type="hidden" name="price" value="2000"/>
</form>
<form action="addCar.jsp" method="post">
<tr><td>ipad</td><td>2000</td><td><input type="submit" name="buy" value="购买"/></td></tr>
<input type="hidden" name="goodname" value="ipad"/>
<input type="hidden" name="price" value="2000"/>
</form>
<form action="addCar.jsp" method="post">
<tr><td>笔记本</td><td>2000</td><td><input type="submit" name="buy" value="购买"/></td></tr>
<input type="hidden" name="goodname" value="笔记本"/>
<input type="hidden" name="price" value="2000"/>
</form>
<form action="addCar.jsp" method="post">
<tr><td>硬盘</td><td>2000</td><td><input type="submit" name="buy" value="购买"/></td></tr>
<input type="hidden" name="goodname" value="硬盘"/>
<input type="hidden" name="price" value="2000"/>
</form>
</table>
<a href="chap4/pay.jsp">查看购物车</a>
</body>
</html>
第二步实现添加购物车和购物车显示 addCar.jsp