1. 程式人生 > >javaweb學習總結 Cookie案例——顯示使用者上次訪問時間

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);
    }

}