知識儲備
首先要先了解什麼是會話,會話就是用戶打開一個瀏覽器,點擊多個鏈接,然後會訪問多個WEB服務,然後再關閉瀏覽器。
有兩種保存會話數據的技術,可以保存用戶的數據,就比如像你購物車裏的數據。而這兩種技術分別是Cookie技術和HttpSession技術。
Cookie的概述
Cookie是客戶端技術,程序會把每一個用戶的數據以Cookie的形式寫給用戶各自的瀏覽器。當用戶再使用瀏覽器去訪問服務器中WEB資源的時候,就會帶着各自的數據去。
Cookie API
javax.servlet.http.Cookie類用於法,它用於在其響應頭中增加一個相應的Set-Cooki創建一個Cookie,response接口中定義了一個addCookie方e頭字段。 同樣,request接口中也定義了一個getCookies方法,它用於獲取客戶端提交的Cookie。Cookie類的方法:
public Cookie(String name,String value)
setValue與getValue方法
setMaxAge與getMaxAge方法 (秒)
setPath與getPath方法
setDomain與getDomain方法
getName方法
例子演示:
*1. 獲取客戶端最後訪問時間:
//告訴服務器應該使用UTF-8來解析文件,告訴客戶端使用什麼來編碼
response.setContentType("text/html;charset=UTF-8");
//得到一個字符輸出流
PrintWriter out = response.getWriter();
//獲取客戶端保存的最後訪問時間
Cookie[] cookies = request.getCookies();//獲取客戶端的所有Cookie對象
for (int i = 0;cookies!=null && i < cookies.length; i++) {
if("lastAccessTime".equals(cookies[i].getName())){//判斷當前Cookie中的name是否是想要的cookie
long l = Long.parseLong(cookies[i].getValue());//如果是想要的Cookie,則把Cookie中的value取出
out.write("你的最後訪問時間爲:"+new Date(l).toLocaleString());//yyyy-MM-dd
}
}
//創建cookie,
Cookie ck = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
//把cookie信息寫回到客戶端
response.addCookie(ck);
Cookie屬性
name:名稱不能唯一確定一個Cookie。路徑可能不同。
value:不能存中文。
path:默認值是寫Cookie的那個程序的訪問路徑
- 比如:http://localhost:8080/day10/servlet/demo1寫的Cookie
- path就是:/day10/servlet 看當前創建cookie的資源(servlet)文件路徑
- 客戶端在訪問服務器另外資源時,根據訪問的路徑來決定是否帶着Cookie到服務器
- 當前訪問的路徑如果是以cookie的path開頭的路徑,瀏覽器就帶。否則不帶。
maxAge:cookie的緩存時間。默認是-1(默認存在瀏覽器的內存中)。單位是秒。
負數:cookie的數據存在瀏覽器緩存中
0:刪除。路徑要保持一致,否則可能刪錯人。
正數:緩存(持久化到磁盤上)的時間
演示代碼:
//告訴服務器應該使用UTF-8來解析文件,告訴客戶端使用什麼來編碼
response.setContentType("text/html;charset=UTF-8");
//得到一個字符輸出流
PrintWriter out = response.getWriter();
//獲取客戶端保存的最後訪問時間
Cookie[] cookies = request.getCookies();//獲取客戶端的所有Cookie對象
for (int i = 0;cookies!=null && i < cookies.length; i++) {
if("lastAccessTime".equals(cookies[i].getName())){//判斷當前Cookie中的name是否是想要的cookie
long l = Long.parseLong(cookies[i].getValue());//如果是想要的Cookie,則把Cookie中的value取出
out.write("你的最後訪問時間爲:"+new Date(l).toLocaleString());//yyyy-MM-dd
}
}
//創建cookie,
Cookie ck = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
//設置cookie的有效時間,單位是秒
ck.setMaxAge(60*5);//保存時間爲5分鐘
//設置cookie的path
ck.setPath("/");//將當前目錄名給Cookie /day10
//把cookie信息寫回到客戶端
response.addCookie(ck);
Cookie細節
一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。
一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。
瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制爲4KB。
如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒爲單位的時間。英國央行利率決議www.gendan5.com/decision/gbp.html 將最大時效設爲0則是命令瀏覽器刪除該cookie。
注意,刪除cookie時,path必須一致,否則不會刪除
根據Cookie做的簡單登錄(會記住用戶名)
LoginServlet.java
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String userName ="";
String checked = "";
//得到客戶端保存的Cookie數據
Cookie[] cookies = request.getCookies();
for (int i = 0;cookies!=null && i < cookies.length; i++) {
if("userName".equals(cookies[i].getName())){
userName = cookies[i].getValue();
checked = "checked='checked'";
}
}
out.write("<form action='"+request.getContextPath()+"/servlet/doLogin' method='post'>");
out.write("用戶名:<input type='text' name='userName' value='"+userName+"'/><br/>");
out.write("密碼:<input type='password' name='pwd'/><br/>");
out.write("<input type='checkbox' name='remember' "+checked+" />記住用戶名<br/>");
out.write("<input type='submit' value='登錄'/><br/>");
out.write("</form>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
DoLogin.java
public class DoLogin extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//獲取表單數據
String userName = request.getParameter("userName");
String pwd = request.getParameter("pwd");
String remember = request.getParameter("remember");
Cookie ck = new Cookie("userName", userName);
ck.setPath("/");
//處理業務邏輯
//分發轉向
if("lwb".equals(userName)){
if("123".equals(pwd)){
if(remember!=null){
ck.setMaxAge(Integer.MAX_VALUE);
}else{
ck.setMaxAge(0);
}
response.addCookie(ck);
out.write("登陸成功!");
response.setHeader("refresh", "2;url="+request.getContextPath()+"/servlet/login");
}else{
out.write("密碼不正確!");
response.setHeader("refresh", "2;url="+request.getContextPath()+"/servlet/login");
}
}else{
out.write("沒有此用戶");
response.setHeader("refresh", "2;url="+request.getContextPath()+"/servlet/login");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}