cookie和session

两个会话的技术(cookie和session)

  1. 会话概念:打开浏览器,可以访问WEB资源,多次访问WEB资源,关闭浏览器,整个过程一次会话。
  2. 购买商品
    用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,
    以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐。

把商品存入到ServletContext获取request域中呢?
ServletContext获取request
cookie和seesion的原理
cookie和seesion的原理

cookie

  1. 显示上次的访问时间(案例)
    * 第一次访问,输出欢迎,在服务器端,记录当前的时间,把当前的时间通过cookie回写到浏览器。
    * 第二次访问,会带着上次的时间,获取时间,可以把时间显示到页面上,记录当前的时间,再把回写浏览器。
    * 输出上次的访问时间

  2. 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)进行设置。

  3. 显示用户上次访问过的商品信息(需求)
    * 1.获取请求参数
    * 2.获取cookie数组,通过指定的名称(自己指定)查找cookie
    * 3.如果cookie==null,第一次访问
    * * 如果是第一次访问,创建cookie,回写浏览器
    * 4.如果cookie!=null,不是第一次访问
    * * 如果不是第一次访问,说明我的cookie中已经存在id
    * * 判断,当前的id是否已经存在cookie的中value
    * * 如果存在,不用操作
    * * 如果不存在,在后面追加(product=1,2)
    * 5.重定向到商品页面

session(服务器)

  1. cookie基于客户端,不安全,并且大小和个数的限制。
  2. session域对象,范围一次会话范围,存个人相关的数据。
    * setAttribute(String name, Object value)
    * Object getAttribute(String name)
    * String getId() 获取seesion的唯一的ID
    * void invalidate() 销毁的seesion
  3. 完成简单的购物车(带代码)
    * 购物车 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);
	}

}
  1. session的创建和销毁
    * 第一次访问资源,调用request.getSession(),创建session
    * 销毁
    * 非正常关闭服务器()
    * 调用session.invalidate() 手动销毁session
    * session的过期,默认是30分钟。
<session-config>
	<session-timeout>30</session-timeout>
</session-config>
  1. session的域对象
    ServlerContext :代表整个web应用,数据库链接
    session :一次会话,存放个人的信息。
    request :一次请求,存放错误处理。
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值