通過兩個案例簡要介紹會話技術–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條瀏覽記錄