1. 程式人生 > >【每日一學190731】cookie基礎

【每日一學190731】cookie基礎

由於cookie的使用與jsp有關聯,會使用到部分jsp技術,所以先簡單介紹一下jsp。

簡單介紹jsp

jsp的出現是為了解決Serlvet中拼接大量的html程式碼的問題,同時在jsp技術中可以直接書寫html,js,css和java程式碼。

jsp中嵌入java程式碼

jsp中可以寫java程式碼,但是需要使用相應的標籤來封裝java程式碼,有三種方式:

  • <%! %>: jsp指令碼宣告,可以書寫成員變數,方法以及內部類
    	<%!
    		//宣告變數
    		int a = 1;
    		//方法
    		public void show() {
    			System.out.println(a);
    		}
    		//成員內部類
    		class Inner{}
    	%>
    
  • <%= %>: jsp指令碼表示式,用於直接輸出資料
    		<!-- 需要注意的是jsp指令碼表示式,在書寫表示式的時候,後面不能新增分號 -->
    		<%="aaa"+123+"bvd"%>
    		<!-- 指令碼表示式可以用於輸入html原始碼資訊  -->
    		<%="<font color='red'>hello</font>"%>
    
  • <% %>: jsp的指令碼片段,可以將java程式碼和html程式碼進項巢狀混合書寫
    	<%
    		for (int i = 0; i < 10; i++) {
    			if (i % 2 == 0) {
    			%>
    				<!-- 這裡是巢狀的html程式碼  -->
    				<font color='red'>
    			<%=i%>
    				</font>
    			<%
    			} else {
    				%>
    				<!-- 這裡是巢狀的html程式碼  -->
    				<font color='red'>
    					<%=i%>
    				</font>
    			<%
    			}
    		}
    	%>
    

EL表示式

EL全名為Expression Language,他的功能主要是在jsp頁面上,從不同範圍內取出資料,這裡所說的範圍是ServletContext範圍和Request。servlet中,servletContext代表當前這個web專案,每一個專案有一個唯一的ServletContext和其對應,因此放在servletContxt中的資料,在jsp頁面可以通過el表示式取出,同時每一個請求,都表示一個request物件,所以在request物件中存放的資料,在jsp頁面也是可以使用el表示式取出。形式為**${key}**

cookie

cookie簡介

  • cookie本身依然是伺服器內部的一個物件,只是這個物件最終會在響應中給客戶端物件,客戶端(一般是瀏覽器)會識別cookie資訊,同時在後續的訪問過程中瀏覽器會將這個cookie攜帶在請求頭中一起傳送給伺服器。
  • 瀏覽器攜帶cookie的特性,是由w3c的http協議規定的,並且會在請求頭中攜帶,如果響應的資料中含有cookie,cookie也是在響應的頭中(注意不是在響應體中)。 從上面的客戶端與服務端的連線可以知道cookie屬於會話技術。

什麼是會話

使用者在開啟瀏覽器訪問伺服器,在一系列的訪問過程中把使用者的這些操作稱為使用者和伺服器之間的對話(客戶端和服務端的會話),在互動過程中,使用者的一系列操作,會產生一些資料需要儲存,此時就需要使用到cookie或者session(下一篇介紹)技術。

小案例之服務端設定cookie返回給客戶端

servlet

package top.cookies;

import javax.servlet.http.Cookie;
import java.io.IOException;

public class cookieServlet extends javax.servlet.http.HttpServlet {
    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        Cookie cookie = new Cookie("name", "testCookie");
        // response.addCookie(cookie);
        response.getWriter().write("helloworld");
    }
}

xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>top.cookies.cookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/cookie</url-pattern>
    </servlet-mapping>
</web-app>

第一次請求結果(返回時不設定cookie)

這裡首先是將response.addCookie(cookie);這一句程式碼給註釋掉了,也就是返回的資料中是沒有cookie的,此時結果如下:

第一次請求(返回時設定cookie)

現在將註釋的那一句程式碼給放開,此時請求結果如下:

可以看到response中已經有了cookie的資訊,但是請求頭中是沒有cookie的資訊的。

第二次請求

在第一次請求時由於在響應中設定了cookie,所以在第二次請求的時候請求頭中應該攜帶cookie資訊的,此時結果如下:

可以看到在請求頭中是包含cookie資訊的。

獲取cookie

設定cookie是服務端設定後給到客戶端,那麼獲取cookie實際上就是從請求頭中獲取cookie,也就是從httpServletRequest物件中獲取cookie,由於使用者可以攜帶有多個cookie,因此可以使用getCookies()方法獲取cookie陣列。

Cookie[] cookies = request.getCookies();
for (Cookie cookie: cookies ) {
    System.out.println(cookie.getName() + "--" + cookie.getValue());
}

cookie分類

cookie主要是分為兩類:

  • 臨時會話級別的cookie

    伺服器給客戶端傳送的cookie,如果沒有指定cookie在客戶端的儲存時間,此cookie只會在瀏覽器的執行期間存在,當瀏覽器關閉後,客戶端中的cookie會消失。

  • 持久化的cookie

    在伺服器給客戶端傳送cookie的時候,可以指定cookie在客戶端存活的時間。可以通過setMaxAge(int)方法來實現。

    • 該方法的單位是秒
    • 如果為負數表示不儲存該cookie
    • 如果是0表示刪除該cookie

給cookie設定路徑

在設定cookie的時候,每一個cookie物件都需要和當面的訪問路徑一致,如果設定的cookie和路徑不一致,在伺服器端是無法獲取到cookie資訊的,設定路徑可以使用cookie物件中的setPath(String)方法來完成,路徑一般會設定專案根目錄。這樣設定只要訪問當前專案中的內容,請求頭就會攜帶對應的資訊,如歐冠在設定cookie的時候,沒有設定響應的path,此時會使用預設的路徑。

設定訪問路徑的作用

設定每一個cookie自己的訪問路徑的作用是在訪問每一個網站時,來判斷是否需要攜帶當前的cookie資料,因為一個網站的後臺可能會有多個不同功能的cookie物件存在,但是這些物件不是每一次請求都需要帶給伺服器,所以也就可以給不同的cookie物件在生成的時候設定不同的路徑,這樣當客戶端訪問伺服器的時候就可以根據不同的訪問路徑來攜