1. 程式人生 > >【HTTP與HTTPS】3.理解Cookie和Session機制(二)

【HTTP與HTTPS】3.理解Cookie和Session機制(二)

目錄

一、Session機制

除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力。

Session技術則是服務端的解決方案,它是通過伺服器來保持狀態的。由於Session這個詞彙包含的語義很多,因此需要在這裡明確一下 Session的含義。首先,我們通常都會把Session翻譯成會話,因此我們可以把客戶端瀏覽器與伺服器之間一系列互動的動作稱為一個 Session。從這個語義出發,我們會提到Session持續的時間,會提到在Session過程中進行了什麼操作等等;其次,Session指的是伺服器端為客戶端所開闢的儲存空間,在其中儲存的資訊就是用於保持狀態。從這個語義出發,我們則會提到往Session中存放什麼內容,如何根據鍵值從 Session中獲取匹配的內容等。要使用Session,第一步當然是建立Session了。那麼Session在何時建立呢?當然還是在伺服器端程式執行的過程中建立的,不同語言實現的應用程式有不同建立Session的方法,而在Java中是通過呼叫HttpServletRequest的getSession方法(使用true作為引數)建立的。在建立了Session的同時,伺服器會為該Session生成唯一的Session id,而這個Session id在隨後的請求中會被用來重新獲得已經建立的Session;在Session被建立之後,就可以呼叫Session相關的方法往Session中增加內容了,而這些內容只會儲存在伺服器中,發到客戶端的只有Session id;當客戶端再次傳送請求的時候,會將這個Session id帶上,伺服器接受到請求之後就會依據Session id找到相應的Session,從而再次使用之。正式這樣一個過程,使用者的狀態也就得以保持了。

二、什麼是Session

Session是另一種記錄客戶狀態的機制,不同的是Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了。

如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查伺服器上的“客戶明細表”來確認客戶身份。Session相當於程式在伺服器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

三、實現使用者登入

Session對應的類為javax.servlet.http.HttpSession類。每個來訪者對應一個Session物件,所有該客戶的狀態資訊都儲存在這個Session物件裡。Session物件是在客戶端第一次請求伺服器的時候建立的。Session也是一種key-value的屬性對,通過getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法讀寫客戶狀態資訊。Servlet裡通過request.getSession()方法獲取該客戶的Session,例如:

HttpSession session = request.getSession();       // 獲取Session物件
session.setAttribute("loginTime", new Date());     // 設定Session中的屬性
 
out.println("登入時間為:" +(Date)session.getAttribute("loginTime"));      // 獲取Session屬性

request還可以使用getSession(boolean create)來獲取Session。區別是如果該客戶的Session不存在,request.getSession()方法會返回null,而getSession(true)會先建立Session再將Session返回。

Servlet中必須使用request來程式設計式獲取HttpSession物件,而JSP中內建了Session隱藏物件,可以直接使用。如果使用聲明瞭<font color=#c7254e><%@page session="false" %>,則Session隱藏物件不可用。下面的例子使用Session記錄客戶賬號資訊。 session.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>
<jsp:directive.page import="com.helloweenvsfei.sessionWeb.bean.Person"/>
<jsp:directive.page import="java.text.SimpleDateFormat"/>
<jsp:directive.page import="java.text.DateFormat"/>
<jsp:directive.page import="java.util.Date"/>
<%!
    DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");         // 日期格式化器
%>
<%
    response.setCharacterEncoding("UTF-8");        // 設定request編碼
    Person[] persons =
    {           
       // 基礎資料,儲存三個人的資訊
        new Person("Liu Jinghua","password1", 34, dateFormat.parse
        ("1982-01-01")),
        new Person("Hello Kitty","hellokitty", 23, dateFormat.parse
        ("1984-02-21")),
        new Person("Garfield", "garfield_pass",23, dateFormat.parse
        ("1994-09-12"))
     };
 
    String message = "";                      // 要顯示的訊息
 
    if(request.getMethod().equals("POST"))
    { 
        // 如果是POST登入       
        for(Person person :persons)
        {           
           // 遍歷基礎資料,驗證賬號、密碼
           // 如果使用者名稱正確且密碼正確
           if(person.getName().equalsIgnoreCase(request.getParameter("username"))&&person.getPassword().equals(request.getParameter("password")))
           {              
               // 登入成功,設定將使用者的資訊以及登入時間儲存到Session
               session.setAttribute("person", person);                   // 儲存登入的Person
               session.setAttribute("loginTime", new Date());          // 儲存登入的時間              
               response.sendRedirect(request.getContextPath() + "/welcome.jsp");
               return;
            }
        }      
        message = "使用者名稱密碼不匹配,登入失敗。";       // 登入失敗
    }
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
    // ... HTML程式碼為一個FORM表單,程式碼略,請看隨書光碟
</html>

登入介面驗證使用者登入資訊,如果登入正確,就把使用者資訊以及登入時間儲存進Session,然後轉到歡迎頁面welcome.jsp。welcome.jsp中從Session中獲取資訊,並將使用者資料顯示出來。 welcome.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>
<jsp:directive.pageimport="com.helloweenvsfei.sessionWeb.bean.Person"/>
<jsp:directive.page import="java.text.SimpleDateFormat"/>
<jsp:directive.page import="java.text.DateFormat"/>
<jsp:directive.page import="java.util.Date"/>
<%!
    DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");         // 日期格式化器
%>
<%
    Person person =(Person)session.getAttribute("person");                       // 獲取登入的person
    Date loginTime =(Date)session.getAttribute("loginTime");                     // 獲取登入時間
%>
    // ... 部分HTML程式碼略
            <table>
               <tr><td>您的姓名:</td>
                   <td><%= person.getName()%></td>
               </tr>
               <tr><td>登入時間:</td>
                   <td><%= loginTime%></td>
               </tr>
               <tr><td>您的年齡:</td>
                   <td><%= person.getAge()%></td>
               </tr>
               <tr><td>您的生日:</td>
                   <td><%=dateFormat.format(person.getBirthday()) %></td>
               </tr>
            </table>

注意:程式中Session中直接儲存了Person類物件與Date類物件,使用起來要比Cookie方便。當多個客戶端執行程式時,伺服器會儲存多個客戶端的Session。獲取Session的時候也不需要宣告獲取誰的Session。Session機制決定了當前客戶只會獲取到自己的Session,而不會獲取到別人的Session。各客戶的Session也彼此獨立,互不可見。

提示:Session的使用比Cookie方便,但是過多的Session儲存在伺服器記憶體中,會對伺服器造成壓力。

四、Session的生命週期

Session儲存在伺服器端。為了獲得更高的存取速度,伺服器一般把Session放在記憶體裡。每個使用者都會有一個獨立的Session。如果Session內容過於複雜,當大量客戶訪問伺服器時可能會導致記憶體溢位。因此,Session裡的資訊應該儘量精簡。

Session在使用者第一次訪問伺服器的時候自動建立。需要注意只有訪問JSP、Servlet等程式時才會建立Session,只訪問HTML、IMAGE等靜態資源並不會建立Session。如果尚未生成Session,也可以使用request.getSession(true)強制生成Session。

Session生成後,只要使用者繼續訪問,伺服器就會更新Session的最後訪問時間,並維護該Session。使用者每訪問伺服器一次,無論是否讀寫Session,伺服器都認為該使用者的Session“活躍(active)”了一次。

五、Session的有效期

由於會有越來越多的使用者訪問伺服器,因此Session也會越來越多。為防止記憶體溢位,伺服器會把長時間內沒有活躍的Session從記憶體刪除。這個時間就是Session的超時時間。如果超過了超時時間沒訪問過伺服器,Session就自動失效了。

Session的超時時間為maxInactiveInterval屬性,可以通過對應的getMaxInactiveInterval()獲取,通過setMaxInactiveInterval(longinterval)修改。

Session的超時時間也可以在web.xml中修改。另外,通過呼叫Session的invalidate()方法可以使Session失效。

六、Session的常用方法

Session中包括各種方法,使用起來要比Cookie方便得多。Session的常用方法如下所示。

void setAttribute(String attribute, Object value):設定Session屬性。value引數可以為任何Java Object。通常為Java Bean。value資訊不宜過大 
String getAttribute(String attribute):返回Session屬性 
Enumeration getAttributeNames():返回Session中存在的屬性名
void removeAttribute(String attribute):移除Session屬性 String getId():返回Session的ID。該ID由伺服器自動建立,不會重複 
long getCreationTime():返回Session的建立日期。返回型別為long,常被轉化為Date型別,例如:Date createTime = new Date(session.getCreationTime()) 
long getLastAccessedTime():返回Session的最後活躍時間。返回型別為long 
int getMaxInactiveInterval():返回Session的超時時間。單位為秒。超過該時間沒有訪問,伺服器認為該Session失效 
void setMaxInactiveInterval(int second):設定Session的超時時間。單位為秒 
void putValue(String attribute, Object value):不推薦的方法。已經被setAttribute(String attribute, Object Value)替代 
Object getValue(String attribute):不被推薦的方法。已經被getAttribute(String attr)替代 
boolean isNew():返回該Session是否是>新建立的 
void invalidate():使該Session失效

Tomcat中Session的預設超時時間為20分鐘。通過setMaxInactiveInterval(int seconds)修改超時時間。可以修改web.xml改變Session的預設超時時間。例如修改為60分鐘:

<session-config>
   <session-timeout>60</session-timeout>      <!-- 單位:分鐘 -->
</session-config>

注意:引數的單位為分鐘,而setMaxInactiveInterval(int s)單位為秒。

在server.xml中定義context時採用如下定義(單位為秒):

<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true"
    isWARValidated="false" isInvokerEnabled="true"
    isWorkDirPersistent="false"/>

七、Session對瀏覽器的要求

雖然Session儲存在伺服器,對客戶端是透明的,它的正常執行仍然需要客戶端瀏覽器的支援。這是因為Session需要使用Cookie作為識別標誌。HTTP協議是無狀態的,Session不能依據HTTP連線來判斷是否為同一客戶,因此伺服器向客戶端瀏覽器傳送一個名為JSESSIONID的Cookie,它的值為該Session的id(也就是HttpSession.getId()的返回值)。Session依據該Cookie來識別是否為同一使用者。

該Cookie為伺服器自動生成的,它的maxAge屬性一般為–1,表示僅當前瀏覽器內有效,並且各瀏覽器視窗間不共享,關閉瀏覽器就會失效。

因此同一機器的兩個瀏覽器視窗訪問伺服器時,會生成兩個不同的Session。但是由瀏覽器視窗內的連結、指令碼等開啟的新視窗(也就是說不是雙擊桌面瀏覽器圖示等開啟的視窗)除外。這類子視窗會共享父視窗的Cookie,因此會共享一個Session。

注意:新開的瀏覽器視窗會生成新的Session,但子視窗除外。子視窗會共用父視窗的Session。例如,在連結上右擊,在彈出的快捷選單中選擇“在新視窗中開啟”時,子視窗便可以訪問父視窗的Session。

如果客戶端瀏覽器將Cookie功能禁用,或者不支援Cookie怎麼辦?例如,絕大多數的手機瀏覽器都不支援Cookie。Java Web提供了另一種解決方案:URL地址重寫。

八、URL地址重寫

URL地址重寫是對客戶端不支援Cookie的解決方案。URL地址重寫的原理是將該使用者Session的id資訊重寫到URL地址中。伺服器能夠解析重寫後的URL獲取Session的id。這樣即使客戶端不支援Cookie,也可以使用Session來記錄使用者狀態。HttpServletResponse類提供了encodeURL(Stringurl)實現URL地址重寫,例如:

<td>
    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>"> 
    Homepage</a>
</td>

該方法會自動判斷客戶端是否支援Cookie。如果客戶端支援Cookie,會將URL原封不動地輸出來。如果客戶端不支援Cookie,則會將使用者Session的id重寫到URL中。重寫後的輸出可能是這樣的:

<td>
    <a href="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=1&wd=Java">Homepage</a>
</td>

即在檔名的後面,在URL引數的前面添加了字串“;jsessionid=XXX”。其中XXX為Session的id。分析一下可以知道,增添的jsessionid字串既不會影響請求的檔名,也不會影響提交的位址列引數。使用者單擊這個連結的時候會把Session的id通過URL提交到伺服器上,伺服器通過解析URL地址獲得Session的id。

如果是頁面重定向(Redirection),URL地址重寫可以這樣寫

<%
    if(“administrator”.equals(userName)) {
        response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));
        return;
    }
%>

效果跟response.encodeURL(String url)是一樣的:如果客戶端支援Cookie,生成原URL地址,如果不支援Cookie,傳回重寫後的帶有jsessionid字串的地址。

對於WAP程式,由於大部分的手機瀏覽器都不支援Cookie,WAP程式都會採用URL地址重寫來跟蹤使用者會話。

注意:TOMCAT判斷客戶端瀏覽器是否支援Cookie的依據是請求中是否含有Cookie。儘管客戶端可能會支援Cookie,但是由於第一次請求時不會攜帶任何Cookie(因為並無任何Cookie可以攜帶),URL地址重寫後的地址中仍然會帶有jsessionid。當第二次訪問時伺服器已經在瀏覽器中寫入Cookie了,因此URL地址重寫後的地址中就不會帶有jsessionid了。

由於Cookie可以被人為的禁止,必須有其他機制以便在Cookie被禁止時仍然能夠把session id傳遞迴伺服器。經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面,附加方式也有兩種: 一種是作為URL路徑的附加資訊,表現形式為http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 一種是作為查詢字串附加在URL後面,表現形式為http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

這兩種方式對於使用者來說是沒有區別的,只是伺服器在解析的時候處理的方式不同,採用第一種方式也有利於把session id的資訊和正常程式引數區分開來。為了在整個互動過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個session id。

另一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。比如下面的表單:

<form name="testform" action="/xxx">
    <input type="text">
</form>

在被傳遞給客戶端之前將被改寫成:

<form name="testform" action="/xxx">
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
    <input type="text">
</form>

這種技術現在已較少應用。

在談論session機制的時候,常常聽到這樣一種誤解“只要關閉瀏覽器,session就消失了”。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程式通知伺服器刪除一個session,否則伺服器會一直保留,程式一般都是在使用者做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來儲存session id,而關閉瀏覽器後這個 session id就消失了,再次連線伺服器時也就無法找到原來的session。如果伺服器設定的cookie被儲存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id傳送給伺服器,則再次開啟瀏覽器仍然能夠找到原來的session。

恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設定了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省儲存空間。

九、Session中禁止使用Cookie

既然WAP上大部分的客戶瀏覽器都不支援Cookie,索性禁止Session使用Cookie,統一使用URL地址重寫會更好一些。Java Web規範支援通過配置的方式禁用Cookie。下面舉例說一下怎樣通過配置禁止使用Cookie。

開啟專案sessionWeb的WebRoot目錄下的META-INF資料夾(跟WEB-INF資料夾同級,如果沒有則建立),開啟context.xml(如果沒有則建立),編輯內容如下: /META-INF/context.xml:

<?xml version='1.0' encoding='UTF-8'?>
    <Context path="/sessionWeb"cookies="false">
</Context>

或者修改Tomcat全域性的conf/context.xml,修改內容如下: context.xml:

<!-- The contents of this file will be loaded for eachweb application -->
<Context cookies="false">
    <!-- ... 中間程式碼略 -->
</Context>

部署後TOMCAT便不會自動生成名JSESSIONID的Cookie,Session也不會以Cookie為識別標誌,而僅僅以重寫後的URL地址為識別標誌了

注意:該配置只是禁止Session使用Cookie作為識別標誌,並不能阻止其他的Cookie讀寫。也就是說伺服器不會自動維護名為JSESSIONID的Cookie了,但是程式中仍然可以讀寫其他的Cookie。

十、Cookie與Session的區別

  1. cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上;
  2. cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session;
  3. session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能。考慮到減輕伺服器效能方面,應當使用COOKIE;
  4. 單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K;

Cookie和Session的方案雖然分別屬於客戶端和服務端,但是服務端的session的實現對客戶端的cookie有依賴關係的,上面我講到服務端執行session機制時候會生成session的id值,這個id值會發送給客戶端,客戶端每次請求都會把這個id值放到http請求的頭部發送給服務端,而這個id值在客戶端會儲存下來,儲存的容器就是cookie,因此當我們完全禁掉瀏覽器的cookie的時候,服務端的session也會不能正常使用(注意:有些資料說ASP解決這個問題,當瀏覽器的cookie被禁掉,服務端的session任然可以正常使用,ASP我沒試驗過,但是對於網路上很多用php和jsp編寫的網站,我發現禁掉cookie,網站的session都無法正常的訪問)。

相關推薦

HTTPHTTPS3.理解CookieSession機制

目錄 一、Session機制 除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力。

前端基礎筆記——關於HTML標簽小知識

nbsp 更新 點擊 name屬性 style con 最好 tex ble http-server 是一個簡單的零配置命令行HTTP服務器, 基於 nodeJs. 安裝-$ npm install http-server -g 開啟 http-server服務,終端進入目

理解CookieSession機制

超時 動態生成 實現 方便 位置 http請求 persist 解決 pri 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務

Unity3D基礎教程給初學者看的Unity教程:所有指令碼元件的基類 -- MonoBehaviour的前世今生

引子 上一次我們講了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全域性變數。GameObject是遊戲中的基本物件。GameObject是由Component組合而成的,GameObject本身必須有

正確理解cookiesession機制原理

php中cookie和session是我們常用的兩個變量了,一個是使用者客戶端的,一個用在伺服器的但他們的區別與工作原理怎麼樣,下面我們一起來看看cookie和session機制原理吧。 cookie和session機制之間的區別和聯絡   具體來說cookie機制

視訊處理工程4、DirectShow基本開發過程

前文講了一些開發DirectShow的基本配置方法以及一些基本的開發過程,如如何創造一個filter並加入filter graph中。這裡繼續上文的步驟討論如何得到filter的pin,以及如何連線兩個filter。 1、如何獲取filter的pin 獲取filter上的p

黑馬程式設計師Objective-C語言學習筆記之類

--------------------------------------------IOS期待與您交流!-------------------------------------------- 一、OC中類的組成 OC中類一般由宣告和實現組成。 類的宣告:儲存在.h檔案

HTTPHTTPS的區別

超文字傳輸協議,即HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊. HTTP協議以明文方式傳送內容,不提供任何方式的資料加密. 如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊. 因此,HTTP協議不適合傳輸一些敏感資訊,比如:信用卡號、密碼等支付資

3.2《深入理解計算機系統》筆記內存高速緩存的原理插圖

img sram 本質 text ddr rate too 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處

專案管理構建Nexus的詳細介紹以及安裝

      前面幾篇博文,我們介紹了怎麼使用maven,這篇博文我們簡單的介紹maven的私服Nexus。簡介        Nexus是Maven倉庫管理器,也可以叫Maven的私服。Nexus是一個

《深入理解計算機系統》筆記記憶體快取記憶體的原理插圖

歡迎檢視《深入理解計算機系統》系列部落格 --------------------------------------------------------------------------------------------------------------

Docker基於例項專案的叢集部署部署專案例項介紹搭建

部署專案簡介 我們要部署的專案是人人網的一個基於前後端分離的專案:renren-fast。 你可以在這裡對該專案進行下載,並對相關介紹文件進行了解: https://www.renren.io/community/project https://www.renren.io/guide

Unity3D基礎教程給初學者看的Unity教程理解Unity的新GUI系統UGUI

理解UGUI的基礎架構 UGUI是Unity在4.6中引入的新的GUI系統,與傳統的中介軟體NGUI相比,這套新GUI系統有幾個核心亮點: 放棄了Atlas的概念,使用Packing Tag的方式來進行圖集的規劃 放棄了depth來確定UI顯示層級的概念,使用Hierarchy的SiblingIndex

代碼筆記Java文件的輸入輸出1——Java.io包的初步理解

對象 eclips 是什麽 reader optional 傳輸 gre 用戶界面 cep Java裏面文件的輸入輸出全部在java.io包裏面。 Java.io包裏面所有的類都需要掌握。 java.io包裏面所有的東西都在上面了。 包裏面的相關類

深入理解G1的GC日誌

本文翻譯自:https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2?source=author&term=22991 這篇文章將深入研究G1的日誌和調優引數。為了在實際工作中對G1

理解Rust中的Futures

原文標題:Understanding Futures in Rust -- Part 2 原文連結:https://www.viget.com/articles/understanding-futures-is-rust-part-2/ 公眾號: Rust 碎碎念 翻譯 by: Praying 背景

extjs6學習筆記0.1 準備:基礎概念02

json over cal 類的屬性 tab 常用事件 data 微軟 基於 Ext 類 Ext 是一個全局單例的對象,在 Sencha library 中它封裝了所有的類和許多實用的方法。許多常用的函數都定義在 Ext 對象裏。它還提供了像其他類中一些頻繁使用的方法

行為型模式《大話設計模式》——讀後感 15烤羊肉串引來的思考?——命令模式

xtend nds () con 耦合度 聲明 一個 客戶端 行為型 命令模式:將一個請求封裝為一個對象,從而使得你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作【DP】 先看代碼吧: Receiver: package com.sj

行為型模式《大話設計模式》——讀後感 16加薪非要老板批?——職責鏈模式

技術 值方法 param images span pack com 適用場景 rri 職責鏈模式(Chain of Responsibility):使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一

Unity3D基礎教程給初學者看的Unity教程:如何學習Unity3D

cos 詳解 component lock index unity3d遊戲 design 技術棧 log 【Unity3D基礎教程】給初學者看的Unity教程(零):如何學習Unity3D http://www.cnblogs.com/neverdie/p/How_To_