servlet总结(四)- 会话技术概述

(一)Cookie技术:客户端技术

Cookie是一段小信息。Servlet把这些小信息写到客户端的缓存中(Set-Cookie),客户端还能带着小信息给服务器(Cookie)。
a、Cookie的属性
name:(必须的)cookie名称
value:(必须的);Cookie值
comment:(可选的)针对该Cookie的注释;
path:(可选的)默认值是写Cookie的那个Servlet的访问路径。/firstApp/servlet/CookieDemo1
有一个cookie,名为a,它的路径为/firstApp/servlet
当访问http://localhost:8080/firstApp/aaa/SomeServlet时,浏览器不会带名为a的cookie带过来。
当访问http://localhost:8080/firstApp/servlet/bbb/ccc/ddd/aaaCookieDemo2,浏览器会带名为a的cookie带过来。
如果把cookie的路径设置为"/firstApp",意味着,firstApp中的所有资源都能得到a。

domain:(可选的)默认值是写Cookie的那个网站。如果domain取值为localhost,那么只有访问localhost这个网站时才会带过去。
maxage:(可选的)设置Cookie的最大存活时间。默认值是浏览器进程(一次会话)。单位是秒。
version:(可选的)
每个客户端针对一个网站,只支持20个cookie。最多保存300个cookie。每个cookie大小不能超过4KB
Tip:
domian+path+name:唯一定位一个Cookie
localhost/firstApp/servlet/lastAccessTime
localhost:domain
/firstApp/servlet/:path
lastAccessTime:name
b、如何向客户端写Cookie:HttpServletResponse.addCookie(Cookie c)

c、服务端如何得到客户端带过来的cookie:HttpServletRequest.getCookies()

demo01:通过cookie记录用户最近访问的3件商品

数据源:

package com.zky.dao;

import java.util.LinkedHashMap;
import java.util.Map;

import com.zky.bean.Book;

public class BookDao {
	private static Map<Long,Book> books = new LinkedHashMap<>();;
	static {
		Book book1 = new Book(1L, "《西游记》", "吴承恩", "¥220", "神话小说");
		Book book2 = new Book(2L, "《红高粱》", "莫言", "¥280", "纪实小说");
		Book book3 = new Book(3L, "《斗破苍穹》", "天蚕土豆", "¥120", "玄幻小说");
		Book book4 = new Book(4L, "《武动乾坤》", "天蚕土豆", "¥420", "玄幻小说");
		Book book5 = new Book(5L, "《大主宰》", "天蚕土豆", "¥720", "玄幻小说");
		books.put(book1.getId(), book1);
		books.put(book2.getId(), book2);
		books.put(book3.getId(), book3);
		books.put(book4.getId(), book4);
		books.put(book5.getId(), book5);
	}
	public static Map<Long,Book> getList() {
		return  books;
	}
	public static Book getBookById(Long id) {
		return books.get(id);
	}
}

获取商品列表和最近浏览记录

package com.zky.cookie;
@WebServlet("/bookList.do")
public class CookieDemo4 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Map<Long,Book> booklist = BookDao.getList();
		List<Book> watchBooks = null;
		Cookie[] cookies = request.getCookies();
		if(cookies != null && cookies.length > 0) {
			for(Cookie c:cookies) {
				if(c.getName().equals("bookIds")){
					watchBooks = new ArrayList<>();
					String[] ids = c.getValue().split(",");
					for(String id : ids) {
						watchBooks.add(BookDao.getBookById(Long.valueOf(id)));
					}
				}
			}
		}
		request.setAttribute("booklist", booklist);
		request.setAttribute("watchBooks", watchBooks);
		request.getRequestDispatcher("/book/bookList.jsp").forward(request, response);
	}
}

浏览记录加入到cookie中

package com.zky.cookie;
@WebServlet("/bookDetail.do")
public class CookieDemo04 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String id = request.getParameter("id");
		Book book = BookDao.getBookById(Long.valueOf(id));
		// 向cookie中添加图书信息(最多保留三本书,最后浏览的一本在最上边)
		Cookie[] cookies = request.getCookies();
		Cookie cookie = null;
		if (cookies == null) {//不存在直接添加
			cookie = new Cookie("bookIds", id);
		} else {
			for (Cookie c : cookies) {
				if (c.getName().equals("bookIds")) {
					cookie = c;
					break;
				}
			}
			StringBuilder sb = new StringBuilder();
			if (cookie == null) {//不存在直接添加
				cookie = new Cookie("bookIds", id);
			} else {
				List<String> idList = Arrays.asList(cookie.getValue().split(","));
				sb.append(id);
				if(idList.contains(id)) {//存在
					for(String bid : idList) {
						if(!id.equals(bid)) {
							sb.append(",").append(bid);
						}
					}
				}else {//不存在
					if(idList.size() == 3) {
						for(int i = 0;i<2;i++) {
							sb.append(",").append(idList.get(i));
						}
					}else {
						for(String bid : idList) {
							sb.append(",").append(bid);
						}
					}
				}
				cookie = new Cookie("bookIds", sb.toString());
			}
		}
		response.addCookie(cookie);
		request.setAttribute("book", book);
		request.getRequestDispatcher("/book/bookDetail.jsp").forward(request, response);
	}
}

demo02:通过cookie实现简单的购物车

商品列表:

package com.zky.cookie;
@WebServlet("/GoodsListServlet.do")
public class GoodsListServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Map<Long,Book> bookMap = BookDao.getList();
		List<Book> shoppingCarts = null;
		Cookie[] cookies = request.getCookies();
		if(cookies != null) {
			for(Cookie c : cookies) {
				if("shoppingCart".equals(c.getName())) {
					shoppingCarts = new ArrayList<>();
					String[] ids = c.getValue().split(",");
					for(String id : ids) {
						Book book = BookDao.getBookById(Long.valueOf(id));
						shoppingCarts.add(book);
					}
				}
			}
		}
		request.setAttribute("bookMap", bookMap);
		request.setAttribute("shoppingCarts", shoppingCarts);
		request.getRequestDispatcher("/shoppingCart/bookList.jsp").forward(request, response);
 	}
}

商品加入到购物车

package com.zky.cookie;
@WebServlet("/addCart.do")
public class AddCart extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String id = request.getParameter("id");
		Cookie[] cookies = request.getCookies();
		Cookie cookie = null;
		if (cookies == null) {
			cookie = new Cookie("shoppingCart", id);
		} else {
			for (Cookie c : cookies) {
				if (c.getName().equals("shoppingCart")) {
					cookie = c;
				}
			}
			if (cookie != null) {
				String ids = cookie.getValue() + "," + id;
				cookie = new Cookie("shoppingCart", ids);
			} else {
				cookie = new Cookie("shoppingCart", id);
			}
		}
		response.addCookie(cookie);
		request.getRequestDispatcher("/shoppingCart/bookDetail.jsp").forward(request, response);
	}
}

(二)HttpSession技术:服务端技术

        在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。session默认有效时间为30分钟。

(1)、HttpSession原理
1、服务器端技术:HttpSession,它也是一个域对象。
2、HttpSession服务器端技术,实际上用的是cookie技术。服务器向客户端写了一个特殊的cookie,名字为"JSESSIONID",值为当前session对象的id(唯一),path是当前应用。
3、HttpSession中常用的方法
a、HttpServletRequest.getSession():根据客户端cookie(JSESSIONID)的值查找session对象,没有,创建一个session对象。
b、HttpServletReqeust.getSession(boolean create):如果为true,与a没有区别。如果为false,只会查找。

c、HttpSession.getId():唯一的session对象标识。

(2)如何创建和使用


         1.客户端浏览器向服务器发送请求

        2.服务器段从请求带过来的Cookie中判断有没有叫做JSESSIONID的,如果没有,创建一个新的session 对象,并把 session的id以cookie的形式写给浏览器。

           3.客户端浏览器再次向服务器发送请求

           4.服务器端此时已经有session的cookie信息,通过JSESSIONID提取出用户的session信息,此时可以就可以对session进行操作了。

相关文章:

(一)浅谈Session与Cookie的区别与联系(转载)

(二)Cookie和session的区别讲解(转载)

猜你喜欢

转载自blog.csdn.net/xingqibaing/article/details/80719221
今日推荐