JavaEE--Cookie和HttpSession的使用小案例

CookieAPI的使用

  • 下面代码展示通过设置cookie存活时间来保存用户名
package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String userName ="";
        String checked = "";
        //得到客户端保存的Cookie数据
        Cookie[] cookies = request.getCookies();
        for (int i = 0;cookies!=null && i < cookies.length; i++) {
            if("userName".equals(cookies[i].getName())){
                userName = cookies[i].getValue();//如果有cookie则自动填充
                checked = "checked='checked'";//如果有cookie则自动勾选
            }
        }

        out.write("<form action='"+request.getContextPath()+"/doLogin' method='post'>");
        out.write("用户名:<input type='text' name='userName' value='"+userName+"'/><br/>");
        out.write("密码:<input type='password' name='pwd'/><br/>");
        out.write("<input type='checkbox' name='remember' "+checked+" />记住用户名<br/>");
        out.write("<input type='submit' value='登录'/><br/>");
        out.write("</form>");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
  • 上面Servlet实现了登录界面,下面Servlet用来实现获取表单数据、处理业务逻辑、分发转向的功能
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DoLoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //获取表单数据
        String userName = request.getParameter("userName");
        String pwd = request.getParameter("pwd");
        String remember = request.getParameter("remember");

        Cookie ck = new Cookie("userName", userName);//创建Cookie
        ck.setPath("/");//设置Cookie的路径为项目路径
        //处理业务逻辑
        //分发转向
        if("tom".equals(userName)&&"123".equals(pwd)){
            if(remember!=null){
                ck.setMaxAge(Integer.MAX_VALUE);//设置Cookie的有效保存时间
            }else{
                ck.setMaxAge(0);//设置时间为0表示立即删除Cookie
            }
            response.addCookie(ck);//将Cookie写回到客户端,当时间设置为0时,执行删除操作
            out.write("登录成功!");
        }else{
            out.write("登录失败!");
            //设置2秒跳到重新登录
            response.setHeader("refresh", "2;url="+request.getContextPath()+"/login");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 下面代码利用cookie实现保存用户最近三条浏览记录的功能。
    • 需要用到的类包括两个Servlet、一个商品(书)类和一个工具类(用来模拟对数据库的读取操作)。
    • 两个Servlet分别用来展示所有书和每个书的详细信息。其中用来展示所有书的页面包括了最近浏览的三条记录。
    • 经过分析发现添加cookie的功能应该在详细信息的Servlet中写,因为只有点了某本书,才会将这本书添加到cookie中。而读取cookie的功能则应该写在展示所有书信息的Servlet中。
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import entity.Book;
import util.DBUtil;

//该Servlet是用来展示所有书信息和历史浏览记录的
public class ShowAllBooksServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			response.setContentType("text/html;charset=UTF-8");
			PrintWriter out = response.getWriter();
			
			out.write("本网站有以下好书:<br/>");
			Map<String, Book> books = DBUtil.findAllBooks();
			for (Map.Entry<String, Book> book : books.entrySet()) {
			    //每一本书都连接到详细信息页面,不过需要在跳转链接中加上书的id
				out.write("<a href='"+request.getContextPath()+"/showBookDetail?id="+book.getKey()+"' target='_blank'>"+book.getValue().getName()+"</a><br/>");
			}
			
			out.write("<hr/>您最近浏览过的书有:<br/>");
			Cookie[] cookies = request.getCookies();//获取cookie数组
			for (int i = 0;cookies!=null && i < cookies.length; i++) {
				if("historyBookId".equals(cookies[i].getName())){//判断是否有historyBookId的cookie
				    //获取名为historyBookId的cookie值,也就是历史浏览书本的id拼接的字符串
					String value = cookies[i].getValue(); 
					String[] ids = value.split("-");
					for (int j = 0; j < ids.length; j++) {
						Book book = DBUtil.findBookById(ids[j]);//根据ID得到指定的书
						out.print(book.getName()+"<br/>");
					}
				}
			}
			
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
  • 上面是用来展示全部商品信息的Servlet,下面是用来展示商品详细信息的Servlet
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import javax.naming.LinkLoopException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import entity.Book;
import util.DBUtil;

public class ShowBookDetail extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		//显示图书的详细信息
		//获得id。无论是post还是get方式提交都可以通过该方法来获取值
		String id = request.getParameter("id");
		Book book = DBUtil.findBookById(id);
		//out.write(book.toString());
		out.print(book);
		
		//把当前浏览过的书的id写回到客户端cookie
		//organizeId方法能够读取原本cookie中有关历史记录的cookie值,然后将其修改后返回回来
		String historyBookId = organizeId(id,request);
		Cookie ck = new Cookie("historyBookId",historyBookId);
		ck.setPath("/");
		ck.setMaxAge(Integer.MAX_VALUE);//设置cookie的保存时间
		
		response.addCookie(ck);//写回到客户端cookie
		
	}

	/**
	 * 客户端							点击的书ID				修改后的cookie值
	 * 没有Cookie						1						historyBookId=1
	 * 有Cookie,但没有historyBookId 	1						historyBookId=1
	 * historyBookId=1					2						historyBookId=2-1
	 * historyBookId=1-2				2						historyBookId=2-1
	 * historyBookId=1-2-3				2						historyBookId=2-1-3
	 * historyBookId=1-2-3				4						historyBookId=4-1-2
	 */
	
	private String organizeId(String id, HttpServletRequest request) {
		//得到客户端的Cookie
		Cookie[] cookies = request.getCookies();
		if(cookies==null){
			return id;
		}
		
		//查找有没有name叫做historyBookId的cookie
		Cookie historyBook = null;
		for (int i = 0; i < cookies.length; i++) {
			if("historyBookId".equals(cookies[i].getName())){
				historyBook = cookies[i];
			}
		}
		
		//如果没有historyBookId的cookie,则还返回id
		if(historyBook==null){
			return id;
		}
		//获取名为historyBookId的cookie值,也就是历史浏览书本的id拼接的字符串
		String value = historyBook.getValue();
		String[] values = value.split("-");
		LinkedList<String> list = new LinkedList<String>(Arrays.asList(values));
        //历史记录中最多只保存3条记录
		if(list.size()<3){ // 1 2
			if(list.contains(id)){
				list.remove(id);//如果包含当前id的值,则删除这个id
			}
		}else{
			if(list.contains(id)){
				list.remove(id);
			}else{//说明有3本书的id了
				list.removeLast();//把最后一个id删除 
			}
		}
		list.addFirst(id);//最新书的id添加到最前面
		
		StringBuffer sb = new StringBuffer();
		for (int i=0; i< list.size();i++) {
			if(i>0){
				sb.append("-");
			}
			sb.append(list.get(i));
		}
		
		return sb.toString();//将StringBuffer类型转为String类型
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
  • 工具类
package servlet;

import java.util.HashMap;
import java.util.Map;

import entity.Book;

public class DBUtil {
	private static Map<String, Book> books = new HashMap<String, Book>();
	
	static{
		books.put("1", new Book("1", "金瓶梅", 20, "王瑞鑫"));
		books.put("2", new Book("2", "葵花宝典", 20, "杨成毅"));
		books.put("3", new Book("3", "九阴真经", 30, "陈光"));
		books.put("4", new Book("4", "玉女心经", 10, "陈志家"));
	}
	
	//得到所有书
	public static Map<String, Book> findAllBooks(){
		return books;
	}
	
	/**
	 * 根据id查找指定的书
	 * @param id
	 * @return
	 */
	public static Book findBookById(String id){
		return books.get(id);
	}
}

HttpSession

  • HttpSession也是一个域对象,它是介于ServletContext和ServletRequest中间的域对象。ServletRequest的范围只限于同一个request,ServletContext的范围是整个项目资源都可以进行设置和获取对象。而HttpSession则是同一会话中的所有资源通向同一个HttpSession对象,可以设置和获取对象。不同的会话对应着不同的HttpSession。
  • HttpSession与Cookie的区别在于:
    • Cookie是客户端技术,只能存取字符串
    • HttpSession是服务器端技术,可以存取对象
  • 下面展示一个例子,通过HttpSession实现购物车功能,能够区别不同用户(购物车存在HttpSession当中)
  • 包括三个Servlet(用于展示所有商品信息,用于添加一本选中的书到购物车中,用于展示购物车中的内容)、两个类(Book和DBUtil用来模拟数据库,跟上面一个例子相同)
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import entity.Book;
import util.DBUtil;

//
public class ShowAllBooksServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.print("本网站有以下好书:<br/>");
        Map<String, Book> books = DBUtil.findAllBooks();
        for (Map.Entry<String, Book> book : books.entrySet()) {
            //点击链接添加商品到购物车,关联一个Servlet
            out.print("<a href='"+request.getContextPath()+"/addCart?id="+book.getKey()+"' >"+book.getValue().getName()+"</a><br/>");
        }
        //点击链接查看购物车,关联一个Servlet
        out.print("<a href='"+request.getContextPath()+"/showCart"+"'>查看购物车</a>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

  • 下面是添加商品的Servlet,在这个Servlet中,需要获取HttpSession,往里面存放的代表购物车的List中添加商品,然后再将List放回HttpSession中。
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import entity.Book;
import util.DBUtil;

public class AddCart extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //根据id得到书
        String id = request.getParameter("id");
        Book book = DBUtil.findBookById(id);
        //得到session对象
        HttpSession session = request.getSession();
        //从session中取出list(购物车)
        List<Book> list = (List<Book>)session.getAttribute("cart");
        if(list==null){
            list = new ArrayList<Book>();
        }
        list.add(book);

        session.setAttribute("cart", list);//把list放回到session域中

        out.print("购买成功!");
        response.setHeader("refresh", "2;url="+request.getContextPath()+"/showAllBooksServlet");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

  • 下面是展示购物车内容的Servlet,在这个Servlet中也需要获取到HttpSession,获取里面的List购物车。
package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import entity.Book;

public class ShowCart extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.print("购物车有以下商品:<br/>");
        HttpSession session = request.getSession();
        //得到session对象
        List<Book> books = (List<Book>)session.getAttribute("cart");
        if(books==null){
            out.print("你还什么都没买呢");
            response.setHeader("refresh", "2;url="+request.getContextPath()+"/showAllBooksServlet");
            return;
        }
        for (Book book : books) {
            out.write(book.getName()+"<br/>");

        }
        //可以设置session的处于非激活状态的存活时长,当时间一到,session销毁,里面存放的东西也都会销毁
        //session.setMaxInactiveInterval(10);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
  • getSession():内部执行原理
    1. 获取名称为JSESSIONID的cookie的值。
    2. 没有这样的cookie,创建一个新的HttpSession对象,分配一个唯一的SessionID,并且向客户端写了一个名字为JSESSIONID=sessionID的cookie
    3. 有这样的Cookie,获取cookie的值(即HttpSession对象的值),从服务器的内存中根据ID找那个HttpSession对象。如果找不到(由于过期等原因),重新创建一个新的HttpSession对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值