两个会话的技术(cookie和session)
- 会话概念:打开浏览器,可以访问WEB资源,多次访问WEB资源,关闭浏览器,整个过程一次会话。
- 购买商品
用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,
以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐。
把商品存入到ServletContext获取request域中呢?
cookie和seesion的原理
cookie
-
显示上次的访问时间(案例)
* 第一次访问,输出欢迎,在服务器端,记录当前的时间,把当前的时间通过cookie回写到浏览器。
* 第二次访问,会带着上次的时间,获取时间,可以把时间显示到页面上,记录当前的时间,再把回写浏览器。
* 输出上次的访问时间。 -
Cookie的API
* cookie的构造方式 Cookie(String name, String value)
* String getName() 获取cookie的名称
* String getValue() 获取cookie的值
* void setMaxAge(int expiry) :设置有效时间
* 失效cookie setMaxAge(0); 前提条件:设置有效路径(和之前设置过相同)
* void setPath(String uri) :设置有效路径
* 默认的有效路径()
* 配置 /last 默认路径 /demo
* 配置 /servlet/last 默认路径 /demo/servlet
* void setDomain(String pattern) :设置有效域名
* www.sina.com.cn
* sports.sina.com.cn
* xxx.sina.com.cn
* 设置有效域名 setDomain(".sian.com.cn");
* 会话级别的cookie:默认保存到浏览器的内存中。
* 持久的cookie:把cookie保存到磁盘上。通过setMaxAge(int a)进行设置。 -
显示用户上次访问过的商品信息(需求)
* 1.获取请求参数
* 2.获取cookie数组,通过指定的名称(自己指定)查找cookie
* 3.如果cookie==null,第一次访问
* * 如果是第一次访问,创建cookie,回写浏览器
* 4.如果cookie!=null,不是第一次访问
* * 如果不是第一次访问,说明我的cookie中已经存在id
* * 判断,当前的id是否已经存在cookie的中value
* * 如果存在,不用操作
* * 如果不存在,在后面追加(product=1,2)
* 5.重定向到商品页面
session(服务器)
- cookie基于客户端,不安全,并且大小和个数的限制。
- session域对象,范围一次会话范围,存个人相关的数据。
* setAttribute(String name, Object value)
* Object getAttribute(String name)
* String getId() 获取seesion的唯一的ID
* void invalidate() 销毁的seesion - 完成简单的购物车(带代码)
* 购物车 Map<String,Integer> cart 购物车,把购物车存入seesion中。
购物页面(cartList.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>购物车</title>
</head>
<body>
<h3>手电筒<a href="/demo/cart?id=1">加入购物车</a></h3>
<h3>冰箱<a href="/demo/cart?id=2">加入购物车</a></h3>
<h3>电视<a href="/demo/cart?id=3">加入购物车</a></h3>
<h3>洗衣机<a href="/demo/cart?id=4">加入购物车</a></h3>
<h3>电脑<a href="/demo/cart?id=5">加入购物车</a></h3>
</body>
</html>
结算页面(pay.jsp)
<%@page import="java.util.Set"%>
<%@page import="java.util.Map"%>
<%@ 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>
<h3>结算页面</h3>
<%
// 获取购物车,把购物车中的商品信息和数量显示到页面上
Map<String,Integer> cart = (Map<String,Integer>)request.getSession().getAttribute("cart");
// 购物车不为空,循环遍历
if(cart != null){
// 循环遍历
Set<String> keys = cart.keySet();
// 循环keys,拿到商品的名称
for(String key : keys){
%>
<h3>亲,您购买的商品是<%= key %>,数量是<%= cart.get(key) %></h3>
<%
}
}else{
%>
<h3>亲,您还没有购物,请您去<a href="/demo/session/cartList.jsp">购物</a></h3>
<%
}
%>
</body>
</html>
购物车后台代码(CartServlet.java)
package cn.itcast.session;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 购物车后台
* @author Administrator
*
*/
public class CartServlet extends HttpServlet {
private static final long serialVersionUID = -4944571720622706932L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.购物车 Map<String,Integer> cart 把购物车存入session中
* 2.先获取购物车,判断是否是第一次访问
* * 第一次访问:创建购物车,把商品的名称和数量加入到购物车,存入session中
* * 不是第一次访问
* * 判断是否包含该商品,通过名称
* * 如果包含,数量+1 存入session中
* * 如果不包含,存入购物车,存入session中
* 3.继续购物或者结算
*/
// 获取参数
String id = request.getParameter("id");
// 购物车存入商品的名称和数量
String [] names = {"手电筒","冰箱","电视","洗衣机","电脑"};
// 把id翻译名称
int idx = Integer.parseInt(id);
// 商品的名称
String name = names[idx - 1];
// 从session中获取购物车,先获取seesion
HttpSession session = request.getSession();
// 从session中获取购物车
Map<String, Integer> cart = (Map<String, Integer>) session.getAttribute("cart");
// 通过cart进行判断,是否是第一次访问
if(cart == null){
// 创建购物车
cart = new HashMap<String, Integer>();
// 第一次访问
cart.put(name, 1);
// 存入到session中
session.setAttribute("cart", cart);
}else{
// 不是第一次访问,判断是否包含该商品
if(cart.containsKey(name)){
// 包含,取出数量,+1,存入购物车,存入seesion中
// 取出
Integer count = cart.get(name);
count++;
// 购物车存入商品
cart.put(name, count);
// 存入的是购物车
session.setAttribute("cart", cart);
}else{
// 不包含
cart.put(name, 1);
// 存入到seesion中
session.setAttribute("cart", cart);
}
}
// 继续购物或者结算
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("<h3><a href='/demo/session/cartList.jsp'>继续购物</a> | <a href='/demo/session/pay.jsp'>去结算</a></h3>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- session的创建和销毁
* 第一次访问资源,调用request.getSession(),创建session
* 销毁
* 非正常关闭服务器()
* 调用session.invalidate() 手动销毁session
* session的过期,默认是30分钟。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- session的域对象
ServlerContext :代表整个web应用,数据库链接
session :一次会话,存放个人的信息。
request :一次请求,存放错误处理。