javaweb學習總結 Cookie案例——顯示使用者上次訪問時間
當訪問某些web應用可顯示使用者上次訪問時間,利用cookie實現.設定cookie的name為lastAccess,value的值為lastAccessTime。
package cn.edu.bdu.mc;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LastAccessServlet")
public class LastAccessServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
/*
* 設定一個 cookie 的name : lastAccessTime 讀取客戶端傳送cookie 獲得使用者上次的訪問時間顯示
*/
String lastAccessTime = null;
// 獲取所有的cookie,並將這些cookie存放在陣列中
Cookie[] cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if ("lastAccess".equals(cookies[i].getName())) {
// 如果cookie的名稱為lastAccess,則獲取該cookie的值
lastAccessTime = cookies[i].getValue();
break;
}
}
// 判斷是否存在名稱為lastAccess的cookie
if(lastAccessTime!=null){
response.getWriter().print("您上次的訪問時間" + lastAccessTime);
}else{
response.getWriter().print("您是首次訪問本站!!!");
}
// 建立cookie,將當前時間作為cookie的值傳送給客戶端
String currenttime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
Cookie cookie = new Cookie("lastAccess",currenttime);
cookie.setMaxAge(60 * 60);// 儲存1小時
// 訪問chapter006下資源時回送cookie
cookie.setPath("/chapter006");
// 傳送 cookie
response.addCookie(cookie);
}
}
在tomcat8.3.5上丟擲異常java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value。
這句話的意思是 一個不識別的字元[32]出現在了cookie當中 由於tomcat的版本比較高,所以在addCookie時是不能使用空格的 而在ASCII碼中32對應的就是空格。只要把後臺程式碼中的空格刪掉就可以了。
可以在獲取當前登入時間時,使用URLEncoder編碼,再設定為cookie的值;在獲取cookie的value值的時候,使用URLDecoder解碼 在輸出的時候使用utf-8輸出中文
package cn.edu.bdu.mc;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LastAccessServlet02
*/
@WebServlet("/LastAccessServlet02")
public class LastAccessServlet02 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LastAccessServlet02() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String currenttime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
currenttime = URLEncoder.encode(currenttime, "UTF-8");
Cookie cookie = new Cookie("lastAccess",currenttime);
cookie.setMaxAge(60 * 60);// 儲存1小時
// 訪問chapter006下資源時回送cookie
cookie.setPath("/chapter006");
// 傳送 cookie
response.addCookie(cookie);
String lastAccessTime = null;
Cookie[] cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if ("lastAccess".equals(cookies[i].getName())) {
// 如果cookie的名稱為lastAccess,則獲取該cookie的值
lastAccessTime = URLDecoder.decode(cookies[i].getValue(),"utf-8");
break;
}
}
response.setContentType("text/html;charset=UTF-8");
// 判斷是否存在名稱為lastAccess的cookie
if(lastAccessTime!=null){
response.getWriter().print("您上次的訪問時間" + lastAccessTime);
}else{
response.getWriter().print("您是首次訪問本站!!!");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}