通过两个案例简要介绍会话技术–Cookie和Session的应用
目录
Cookie:历史浏览记录
此案例好比某宝上商品的浏览记录:当你访问过某件商品后,服务端会保存你的浏览记录,你也可以查看你自己的浏览记录。
简要实现功能,假设背景为网上书城的显示主页面,当我们查看某本书的详细记录退回主页后,可以看到服务器已经记录了我们最新的浏览记录。
1)书的实体类:
public class Book {
//book类
private String id;
private String name;
private String author;
public Book() {
}
public Book(String id, String name, String author) {
this.id = id;
this.name = name;
this.author = author;
}
//get 和 set 方法
...
}
2)通过一个 LinkedHashMap 集合模拟数据库,执行存取操作:
public class Books {
//模拟数据库显示浏览的书籍
private static LinkedHashMap<String,Book> linkedHashMap = new LinkedHashMap();
//增加书籍
static {
linkedHashMap.put("1", new Book("1","java","zs"));
linkedHashMap.put("2", new Book("2","spring","ls"));
linkedHashMap.put("3", new Book("3","vue","ww"));
linkedHashMap.put("4", new Book("4","mysql","zl"));
linkedHashMap.put("5", new Book("5","spring boot","dq"));
linkedHashMap.put("6", new Book("6","微服务","gb"));
}
//获取所有书籍
public static LinkedHashMap getAll() {
return linkedHashMap;
}
}
3)servlet 显示书城主页面,显示书籍列表,可以选择其中的任意书籍查看其详细信息;同时,主页面也显示历史浏览记录(通过Cookie获取):
@WebServlet("/ShowBooks")
public class ShowBooks extends HttpServlet {
private static final long serialVersionUID = 1L;
public ShowBooks() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.write("显示所有书籍:"+"<br>");
//获取所有书籍列表
LinkedHashMap<String,Book> linkedHashMap = Books.getAll();
Set<Map.Entry<String,Book>> entry = linkedHashMap.entrySet();
//显示所有书籍,以超链接的形式,并将本书的id传给书籍详细信息页面,便于获取该书
for(Map.Entry<String, Book> sb:entry) {
Book book = sb.getValue();
out.write("<a href = 'Info?id="+book.getId()+"'> "+book.getName()+"</a><br>");
}
//历史浏览记录部分
out.write("历史浏览记录:"+"<br>");
//获取浏览器传过来的所有cookie
Cookie[] cookies = request.getCookies();
for(int i=0;cookies!=null&&i<cookies.length;i++) {
//找到记录历史浏览记录的cookie
if("history".equals(cookies[i].getName())) {
//获取的history是 1-2-3 类型的字符串
String hs = cookies[i].getValue();
//拆解成为一个一个的id
String[] ids = hs.split("-");
//遍历显示每条浏览记录
for(String id:ids) {
Book book = linkedHashMap.get(id);
out.write(book.getName()+"<br>");
}
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
注意:这里使用书的 id 值组建字符串记录历史浏览记录,类似于 1-2-3,设历史浏览记录最长为3条记录。
4)servlet显示书籍详情页,同时构造保存浏览记录的cookie:
@WebServlet("/Info")
public class Info extends HttpServlet {
private static final long serialVersionUID = 1L;
public Info() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
//获取将要访问书籍的id(之前通过超链接传递过来)
String id = request.getParameter("id");
System.out.println(id);
//获取该id对应的书籍
Book book = (Book) Books.getAll().get(id);
//显示书籍的详细信息
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.write("书籍详细信息:"+"<br>");
out.write("书籍编号: "+book.getId()+"<br>");
out.write("书籍名称: "+book.getName()+"<br>");
out.write("书籍作者: "+book.getAuthor()+"<br>");
//构造历史浏览记录的cookie
String history = makeHistory(request,id);
Cookie cookie = new Cookie("history",history);
cookie.setMaxAge(10*60); //cookie的有效期为10分钟
//将cookie从服务端发送给浏览器
response.addCookie(cookie);
}
private String makeHistory(HttpServletRequest request,String id) {
String history = null;
//获取所有自浏览器发送的cookie,查找存放历史浏览记录的cookie
Cookie[] cookies = request.getCookies();
for(int i=0;cookies!=null&&i<cookies.length;i++) {
//获取存储浏览历史的cookie
if("history".equals(cookies[i].getName())) {
history = cookies[i].getValue();
}
}
if(history==null) {
//若该cookie的内容为空,则将当前访问的书籍id加入该cookie即可
history = id;
}else {
//若该cookie的内容不为空,则拆分该cookie内容,获得当前存在该cookie的书籍id
String[] strs = history.split("-");
List list = Arrays.asList(strs);
//使用LinkedList集合便于修改
LinkedList<String> linkedList = new LinkedList<>();
linkedList.addAll(list);
if(linkedList.contains(id)) {
//如果该cookie中已记录了当前访问的书籍,则将前id记录到最前面
linkedList.remove(id);
linkedList.addFirst(id);
}else {
//如果该cookie没有记录当前访问书籍
if(linkedList.size()>=3) {
//最多保存3条浏览记录,如果该cookie的长度等于3,删除最后那个浏览记录(即最早之前访问的书籍)
linkedList.removeLast();
//将当前访问的书籍id放在最前面
linkedList.addFirst(id);
}else {
//如果cookie的长度还没达到3,还可以直接存储书籍记录
linkedList.addFirst(id);
}
}
//组合成字符串
StringBuffer sb = new StringBuffer();
for(String str:linkedList) {
//以"-"间隔每个书籍id
sb.append(str+"-");
}
//去除最后一个多余的"-"
history = sb.deleteCharAt(sb.length()-1).toString();
}
return history;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
5)结果展示:
未有访问记录时:
初次访问某书:
访问后返回主页(要刷新):
多次访问后:设置了最多记录3条浏览记录