1. 程式人生 > >使用cookie技術實現,快取最近瀏覽過詳細資訊的三本書的書名列表,並進行相應顯示

使用cookie技術實現,快取最近瀏覽過詳細資訊的三本書的書名列表,並進行相應顯示

(1)顯示書名列表,及最近閱讀的最多三本書的書名

public class ShowGoods extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 978235855242977508L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter writer = resp.getWriter();
		writer.write("所有的書籍是:");
		writer.write("</br>");
		for( Entry<String, MyBook> entry: OfferMap.getBookInfo().entrySet()){
			writer.write("<a href = '"+req.getContextPath()+"/ShowGoodsDetails?id="+entry.getKey()+"'>"+entry.getValue().getName()+"</a>");
			writer.write("</br>");
			
		}
		
		writer.write("最近瀏覽的三本書是:");
		writer.write("</br>");
		Cookie[] cookies = req.getCookies();
		if(cookies != null)
		for(Cookie cookie : cookies){
			if("lastVisitBook".equals(cookie.getName()) && cookie.getValue() != null){
				String[] ids = cookie.getValue().split(",");
				for(String id : ids){
					writer.write("<a href = '"+req.getContextPath()+"/ShowGoodsDetails?id="+id+"'>"+OfferMap.getBookInfo().get(id).getName()+"</a>");
					writer.write("</br>");
				}
			}
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}

}

(2)顯示書籍的詳細資訊,並將閱覽的書名資訊存到cookie中

public class ShowGoodsDetails extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -46163301904321918L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		
		LinkedHashMap<String, MyBook> map = OfferMap.getBookInfo();
		PrintWriter writer = resp.getWriter();
		String id = req.getParameter("id");
		if(id != null){
			MyBook myBook = map.get(id);
			writer.write(myBook.getName()+"的詳細資訊是:");
			writer.write("</br>");
			writer.print("ID是:"+myBook.getId()+"<br/>");
			writer.print("書本名是:"+myBook.getName()+"<br/>");
			writer.print("書本價格是:"+myBook.getPrice()+"<br/>");
		}
		
		LinkedList<String> list = new LinkedList<>();
		StringBuffer sb = new StringBuffer();
		Cookie[] cookies = req.getCookies();
		boolean flag = false;
		if(cookies != null){
			for(Cookie cookie : cookies){
				if("lastVisitBook".equals(cookie.getName()) && cookie.getValue() != null){
					String[] ids = cookie.getValue().split(",");
					for(String idname : ids){
						list.add(idname);
					}
					
					//1、如果list中已經有3個,那麼刪除第一個,(存在一種情況,那就是原先已經有的三個裡,這次又重複點選了,那麼正常情況下,其位置應該需要變動)
					if(list.size() >= 3){
						list.removeFirst();
						list.addLast(id);
					}else {
						//2、如果list中不足3個,不是最後一個,那麼就放在後邊一個
						list.add(id);
					}
					for(String name : list){
						sb.append(name+",");
					}
					flag = true;
				}
				
			}
			
			if(flag){
				sb = sb.deleteCharAt(sb.length()-1);
				Cookie[] cookiess = req.getCookies();
				for(Cookie cookie : cookiess){
					if("lastVisitBook".equals(cookie.getName()) && cookie.getValue() != null){
						cookie.setValue(sb.toString());
					}
				}
				//putCookieToResp(resp,sb.toString());
			}else {
				putCookieToResp(resp,sb.append(id).toString());
			}
		}else {
			putCookieToResp(resp,sb.append(id).toString());
		}
		
	}

	private void putCookieToResp(HttpServletResponse resp, String string) {
		Cookie cookie = new Cookie("lastVisitBook", string);
		cookie.setMaxAge(3600*24*30);
		cookie.setPath("/webAndAjax");
		//cookie.setDomain("localhost");
		resp.addCookie(cookie);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}

}

出現的問題:

一開始的時候,在原來有cookie的情況下,修改原來cookie內容的時候,使用的是new的方法,然後在顯示時,一直只顯示初始cookie的key值對應的內容。

       經過查詢資料, Cookie不僅僅有名字和值兩個屬性,還有域(domain),過期時間(expires),路徑(path)等屬性。其中,不同的域、不同的路徑下可以存在同樣名字的cookie。可以推測,相同路徑和域下不能存在兩個相同key值的cookie,所以,new兩次,系統在獲取的時候,第二次new的會出現錯亂,而導致不能獲取正確的cookie內容。

解決方法:採用cookie值修改的方式。

相關推薦

使用cookie技術實現快取最近瀏覽詳細資訊本書書名列表進行相應顯示

(1)顯示書名列表,及最近閱讀的最多三本書的書名 public class ShowGoods extends HttpServlet { /** * */ private static final long serialVersionUID = 9782

教你前端如何一個人從零基礎開發完整的小程式專案包括後臺視覺化資料庫。該專案實現了個人簡歷的增刪改查以及展示和轉發分享以及收藏他人簡歷和檢視還有最近瀏覽的簡歷

GitHub:https://github.com/susuGirl/resume 微信小程式名:你的專屬簡歷(微信可直接搜尋出來檢視),教你前端如何一個人從零基礎開發完整的小程式專案,包括後臺視覺化資料庫。該專案實現了個人簡歷的增刪改查以及展示和轉發分享,以及收藏他人簡歷和檢視,還

cookie技術實現自動登錄+驗證用戶名輸入是否正確

ets htm text cti 創建 sel turn 失去焦點 table login頁面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% Strin

淺談利用Cookie技術實現3天免登陸

private void dologin(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter(

如何實現記錄當前使用者瀏覽的商品

儲存當前使用者瀏覽過的產品,其實這個可以用PHPsession就可以實現了。原理比較簡單,就是當用戶進入產品頁面檢視某個產品的時候就把當前瀏覽產品的產品ID儲存在一個session變數裡面,比如可以這樣if(zen_not_null($_GET['products_id'])) {$_SESSION['rec

JavaWeb_利用Cookie技術實現自動登入

//------------------------------------儲存Cookie------------------------------- package com.MainServlet; import java.io.File; import java.

簡單實現Redis快取中的排序功能(

在實現快取排序功能之前,必須先明白這一功能的合理性。不妨思考一下,既然可以在資料庫中排序,為什麼還要把排序功能放在快取中實現呢?這裡簡單總結了兩個原因:首先,排序會增加資料庫的負載,難以支撐高併發的應用;其次,在快取中排序不會遇到表鎖定的問題。Redis恰好提供了排序功能

手把手教你搭建Vue開發環境也許你看很多版本的腳手架安裝教程但還是容易出現各種問題本文將帶你走一條最快速的路繞過很多坑

手把手教你搭建Vue開發環境,,希望對你有所幫助! Hello,各位同學,好久不見,最近忙於瑣事,拖更了0.0,也許你看過很多版本的腳手架安裝教程,但還是容易出現各種問題,本文將帶你走一條最快速的路,繞過很多坑,什麼都不要說,什麼都不要問,照著做,閒話少

Python 語言基礎()之列表元組

HA std sharp 逗號 打印圖形 但是 有序集合 我們 通過 一、列表   1.概述:   通過前兩天的學習,我們知道變量可以存儲數據,但是一個變量只能存儲一個數據,現在有一個班級,班級有20個人,現在求班級的平均年齡。   本質:list列表的本質是一種有序的集合

解決---MISCONF Redis被配置為儲存RDB快照但目前無法在磁碟上存留。可能修改資料集的命令被禁用。請檢查Redis日誌瞭解有關錯誤的詳細資訊

出現bug: 在學習celery,將資料儲存到redis時出現下面的bug。 consumer: Cannot connect to redis://192.168.12.188:6379/3: MISCONF Redis is configured to save RDB sn

a=[123456]用程式碼求出a裡面個數字組合求出組合裡面的最大數如可以組成123456125634563412561234341256345612。

這個題目主要用到迴圈、字串拼接和排序,程式碼如下: a = [12,34,56] d = []  #儲存新的list for i in a:   for j in a:     for k in a:       if (i != j) and (j != k) and (i != k)

linux在資料夾中查詢檔案包含的字串進行相應的替換

說明如下:要在一個目錄中,查詢所有檔案中包含的字串AAA,找出檔案,並用BBB進行替換掉。 #grep -r AAA ./                                 #表示在當前目錄中遞迴查詢包含AAA的檔案。 #grep -rl AAA ./                     

定義一個二維陣列內容為個學生的四門課成績求出每個學生四門課的平均分輸出再求出每門課個學生的平均分輸出!

// 121211 作業1.cpp : 定義控制檯應用程式的入口點。 // /* * Copyright (c) 2012, 煙臺大學計算機學院 * All rights reserved. * 作 者: 劉同賓

非框架 純原生JS “商品詳情跳轉到商品列表記錄高度“ 的寫法思路

容易出錯 復制 地址 替換 災難 repl 瀏覽記錄 特殊 刷新 這裏只講思路,不提供代碼。 寫之前,我要先吐槽一種非常奇葩的寫法。 下面是他的寫法思路(雖不提倡,但可借鑒): 一個商品列表,然後把商品詳情寫在商品列表裏。 這是一個頁面,兩個不一樣

疫情下我選擇了離職... ; 工作年老程式設計師談談職業規劃

  疫情之下,確實行情不好,相比去年招聘資訊少了很多,因為去年這個時候我也在跳槽。建議:不是非要離職的話,以穩為主,不要瞎跳!!!有錢任性的話,隨意了   疫情離職   疫情之下的面試益處    疫情之下帶來的跳槽好處,就是面試帶來了方便,之前面試你必須要去公司,你說可以電話面試麼?HR一定會說:不可以!!!

利用Cookie實現顯示使用者最近瀏覽的商品

案例目標 將使用者最近瀏覽的商品資訊,在主頁回顯,若瀏覽的商品大於3個,就把第一個刪除,同時若有重複的瀏覽,就把之前的商品資訊刪除 index.jsp用於回顯最近瀏覽的商品資訊 <%@ page language="java" contentType=

最近因為突然喜歡這方面的ui設計所以搜刮了很多我試可用性強的界面又可愛又實用···分享給大家咯

tar 單個 3D pcf 顯示 方便 att 分享 CP 最近因為突然喜歡這方面的ui設計,所以搜刮了很多我試過可用性強的界面,又可愛又實用···分享給大家咯 1.Side-Menu.Android 分類側滑菜單,Yalantis 出品。 項目地址:https://g

使用KVM技術實現yum源創建虛擬機並且能夠聯通外網

virt ini qemu-kvm root dnsmasq dump auto 路徑 -a 第一步將本地的光盤iso鏡像文件掛載到本地的ftp目錄下echo /etc/fstab /root/桌面/ZF-100/nsd/xx/lisi/CLOUD/1/CentOS7-1

自開發一機100號亞馬遜、facebook雲控系統源碼技術實現

rem color start ado hardware lease mod 應用 androi 亞馬遜,facebook雲控系統源碼核心實現。一機100個賬號,每個賬號的硬件環境、機器碼、IMEI、序列號,手機號、IP等等都不相同,每個賬號都有自己獨立的工作環境中。其主要

vue+mousemove實現拖動鼠標移動快拖動就失效

拖動 win text cli prev point element lis 問題 今天用vue+原生js的mousemove事件,寫了個拖動,發現只能慢慢拖動才行,鼠標只要移動快了,就失效,不能拖動了; 搞了半天在,總算解決了,但是問題的深層原理還沒搞清楚,知道的大俠可以