(一)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进行操作了。
相关文章: