cookie的作用:
cookie用於保存會話狀態到客戶端。保留在以下兩個地方:
- 瀏覽器的緩存中;
- 客戶端硬盤文件中。
cookie在java中被當作一個類來處理:javax.servlet.http.Cookie;
cookie不僅僅存在於Java中,只要是web開發,B/S架構,只要是基於http協議,就有cookie。
常見的功能:保留購物車上的商品,多天免登陸.......
1.將cookie存放在瀏覽器緩存中
cookie對象可以通過構造方法直接創建,由兩部分組成,name和value;
//第一個參數為cookie名字,第二個參數為cookie的值
new Cookie(String,String);
這種方式創建的cookie會保存在瀏覽器緩存中,瀏覽器關閉,則cookie消失。
當瀏覽器發起請求時,服務器就會給瀏覽器發送一個cookie,可以發送多個,客戶端也可以獲取到服務器端發送的cookie:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>cookie</title>
</head>
<body>
<a href="/servlet_01_javaweb/cookie01">服務器發送cookie給客戶端瀏覽器</a>
</body>
</html>
package com.dh.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Cookie01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie1 = new Cookie("cookie1", "value1");
//服務器發送cookie
response.addCookie(cookie1);
//客戶端可以獲取cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
//獲取cookie的名字
String cookieName = cookie.getName();
//獲取cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieName + "=" + cookieValue);
}
}
}
cookie和訪問的路徑有關系。
cookie會和特定的路徑綁定在一起,第一次請求,服務器會給客戶端瀏覽器發送cookie,只要沒有結束這次會話,再次請求了特定路徑,客戶端瀏覽器就會攜帶綁定的cookie一起發送給服務器。
如:
設置cookie關聯的路徑
Cookie cookie1 = new Cookie("cookie1", "value1");
//在發送cookie之前可以指定cookie關聯路徑
cookie1.setPath(request.getContextPath()+"/a");
//服務器發送cookie
response.addCookie(cookie1);
此時,只有訪問與http://localhost:8080/servlet_01_javaweb/a有關的路徑,客戶端才能發送特定的cookie給服務器。
2.將cookie保存在瀏覽器硬盤文件中
只要設置cookie的有效時長,並且有效時長>0時,cookie被保存到客戶端的硬盤文件中。
Cookie cookie1 = new Cookie("cookie1", "value1");
cookie1.setMaxAge(60 * 60);//單位為秒,即將cookie的有效時長設置為1小時
response.addCookie(cookie1);
當cookie保存到了客戶端的硬盤文件中,關閉瀏覽器也不會清除cookie,只有到了有效時間cookie才會被清除。
但是可以自己刪除cookie:
將cookie的有效時間設置為0,即為刪除cookie。
//刪除cookie
cookie1.setMaxAge(0);
3.cookie實現10天免登陸
先捋一下邏輯:
當用戶輸入一個地址的時候,先判斷是否攜帶cookie,如果攜帶了cookie再判斷cookie的值,再判斷用戶名和密碼是否正確,如果都正確的話就直接跳轉到主頁,不需要登陸;
如果沒有攜帶cookie信息的話,就直接跳轉到登陸頁面,第一次登陸成功,如果勾選了十天免登錄,服務器就發送cookie,設置有效時間,保存到客戶端硬盤文件中。
web.xml:
<!-- 設置歡迎頁面-->
<welcome-file-list>
<welcome-file>checkLogin</welcome-file>
</welcome-file-list>
<!-- 登陸-->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.dh.cookie.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- 檢查是否攜帶cookie-->
<servlet>
<servlet-name>checkLogin</servlet-name>
<servlet-class>com.dh.cookie.CheckLogin</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkLogin</servlet-name>
<url-pattern>/checkLogin</url-pattern>
</servlet-mapping>
登陸頁面:lg.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陸頁面</title>
</head>
<body>
<form action="/servlet_01_javaweb/login" method="post">
用戶名:<input name="username" type="text"><br>
密碼:<input name="password" type="password"><br>
<input name="tenDays" type="checkbox" value="ok">十天內免登陸<br>
<input type="submit" value="登陸">
</form>
</body>
</html>
登陸成功頁面:success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>success</title>
</head>
<body>
登陸成功!
</body>
</html>
登陸失敗頁面:fail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>fail</title>
</head>
<body>
用戶名或密碼錯誤,請
<a href="/servlet_01_javaweb/lg.html">重新登陸</a>
</body>
</html>
CheckLogin
package com.dh.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CheckLogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取cookie
Cookie[] cookies = request.getCookies();
//取出cookie中的值
String username = null;
String password = null;
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
if("username".equals(cookieName)){
username = cookie.getValue();
}
if("password".equals(cookieName)){
password = cookie.getValue();
}
}
if("zhangsan".equals(username) && "123".equals(password)){
response.sendRedirect("/servlet_01_javaweb/success.html");
}else {
response.sendRedirect("/servlet_01_javaweb/lg.html");
}
}
}
Login:
package com.dh.cookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String tenDays = request.getParameter("tenDays");
//此處不連接數據庫
//用戶名和密碼正確
if ("zhangsan".equals(username) && "123".equals(password)) {
if ("ok".equals(tenDays)) {
//將用戶信息存儲到cookie中,並且關聯路徑和設置有效時間
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password);
cookie1.setPath(request.getContextPath());
cookie2.setPath(request.getContextPath());
cookie1.setMaxAge(60 * 60 * 24 * 10);
cookie2.setMaxAge(60 * 60 * 24 * 10);
//服務器發送cookie給客戶端瀏覽器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
//跳轉到主頁
response.sendRedirect("/servlet_01_javaweb/success.html");
} else {
//跳轉到登陸失敗頁面
response.sendRedirect("/servlet_01_javaweb/fail.html");
}
}
}
以上就能實現10天內免登錄了。登陸成功后,關閉瀏覽器,輸入http://localhost:8080/servlet_01_javaweb/就能直接跳轉到success.html了。