servlet session 跟踪用户上次访问时间
1、是什么? 上次訪問時間;即用戶最近一次登錄時間;?
2、為什么? 為了提示用戶登錄或訪問記錄,提高安全性,如qq登錄提示;?
3、怎么做? 通過cookie 實現; 用戶第1次登錄, 服務器把訪問時間放入cookie 并作為響應報文返回瀏覽器,瀏覽器將cookie 存入磁盤,每次(除第一次外)訪問都帶上她;
補充: 本文在cookie中存儲了訪問時間,若業務場景需要,可以存儲其他數據;??
【荔枝】(轉自張孝祥)
// 跟蹤上次客戶訪問時間 public class AccessTimeServlet extends HttpServlet {public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{response.setContentType("text/html;charset=gb2312");PrintWriter out = response.getWriter();//獲取記錄用戶上次訪問站點時間的CookieCookie [] cks = request.getCookies();String lastAccessTime = getCookie(cks,"access_time");if(lastAccessTime == null){out.println("沒有您上次的訪問記錄");}else{BASE64Decoder decoder = new BASE64Decoder();String decodedAccessTime = new String(decoder.decodeBuffer(lastAccessTime),"GB2312");out.println("您上次的訪問時間為" + decodedAccessTime);}//將用戶開始本次訪問的時間存儲到客戶端Cookie中HttpSession session = request.getSession();if(session.isNew()){long createTime = session.getCreationTime();Date dateCreateTime = new Date(createTime);SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH點mm分ss秒");String formatedCreateTime = sdf.format(dateCreateTime);BASE64Encoder encoder = new sun.misc.BASE64Encoder();String base64CreateTime = encoder.encode(formatedCreateTime.getBytes("GB2312"));Cookie ckAccessTime = new Cookie("access_time",base64CreateTime);ckAccessTime.setMaxAge(365*24*3600);out.println(formatedCreateTime);response.addCookie(ckAccessTime);}}private String getCookie(Cookie [] cks,String cookieName){String cookieValue = null;for(int i=0; cks!=null && i<cks.length; i++){if(cookieName.equals(cks[i].getName())){cookieValue = cks[i].getValue();break;} } return cookieValue;} }4、訪問效果
第1次, cookie中沒有儲存 最近一次訪問的記錄;?
第2次訪問,及其以后 ; 因為第1次服務器已經把 訪問時間存入cookie, 瀏覽器將cookie存入本地文件了;所以后續的訪問,瀏覽器請求報文頭都會帶上服務器返回的cookie 數據;
?
5、為什么 訪問時間access_time 看起來不對勁呢。
因為 access_time 字段值包含中文,如果不經過BASE64編碼,那經過網絡傳輸,可能會丟數據;?
所以 該字段經過 BASE64 編碼過,這里要注意,? BASE64 不是加密算法,而是編碼格式,如UTF-8 GBK 編碼格式,兩者有本質區別;
base64 是什么??Base64 是一種基于 64 個可打印字符來表示二進制數據的表示方法。目前 Base64 已經成為網絡上常見的傳輸 8 位二進制字節代碼的編碼方式之一。
base64 為什么?
我們知道在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。 而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備, 由于不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利于傳輸的。 所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。base64 怎么做???
它的編碼過程如下: 步驟1:將待轉換的字符串每三個字節分為一組,每個字節占 8 個二進制位,那么共有 24 個二進制位。 步驟2:將第(1)步得到的每 24 個二進制位分為每 6 個一組,則每 3 個字節可分為 4 組。 步驟3:在每組前面添加兩個 0 ,每組由 6 個二進制位變為 8 個二進制位,總共 32 個二進制位,即四個字節。根據 Base64編碼對照表(見下表)獲得對應的值。關于 base64 更多信息,可以參考??https://blog.csdn.net/PacosonSWJTU/article/details/109955148?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的servlet session 跟踪用户上次访问时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么退出qq电话(怎么退出qq电话聊天)
- 下一篇: 利用session防止表单重复提交