1. 程式人生 > >cookie_session的詳細用法

cookie_session的詳細用法

定義 關閉 web.xml generics 禁止 其它 缺省值 some 對象的引用

相對路徑與絕對路徑

相對路徑:

鏈接地址 <a href="list.do"></a>

表單提交地址 <form action="add.do">

重定向 response.sendRedirect("list.jsp");

轉發 request.getRequestDispatcher("listEmp.jsp");

(1)什麽是相對路徑?

不以"/"開頭的路徑。

(2)什麽是絕對路徑?

"/"開頭的路徑。

(3)怎樣寫絕對路徑?

鏈接地址、表單提交地址、重定向絕對路徑應從應用名開始寫,而轉發應從應用名之後開始。

獲得appnameString request.getContextPath()

如:

重定向——response.sendRedirect(/*重定向從應用名開始寫*/

request.getContextPath()

+ "/app3/sub/some.jsp");

/*轉發從應用名之後寫*/

轉發——request.getRequestDispatcher("/app3/sub/some.jsp")

.forward(request, response);*/

狀態管理

(1)什麽是狀態管理

將客戶端(瀏覽器)與服務器之間多次交互當作一個整體來看,並將多次交互所涉及的數據(狀態)保存下來。

(2)如何進行狀態管理

第一類方式:將狀態保存在客戶端(

Cookie

第二類方式: 將狀態保存在服務器端(Session)

(3)cookie技術:

1) 什麽是cookie?

a,cookie是一種客戶端的狀態管理技術

b,當瀏覽器向服務器發送請求時,服務器會將少量的數據以set-cookie消息頭的方式發送給瀏覽器,

瀏覽器會將這些數據保存下來。當瀏覽器再次訪問服務器時,會將這些數據以cookie消息頭的方式發送給服務器。

2)如何創建一個cookie?

Cookie c = new Cookie(String name,String value);

response.addCookie(c);

3)cookie的查詢

Cookie[] request.getCookies();

註意,該方法有可能返回null

String cookie.getName();

String cookie.getValue();

4)cookie的生存時間

cookie.setMaxAge(int seconds);

註意:單位是秒

seconds >0 : 瀏覽器會將cookie保存在硬盤上,超過指定時間,會刪除該cookie

seconds < 0 : 缺省值,瀏覽器會將cookie保存在內存裏,只要瀏覽器不關閉,cookie一直保存,當瀏覽器關閉,cookie會被清空。

seconds = 0 : 刪除cookie

比如,要刪除一個名叫userIdcookie:

Cookie c = new Cookie("userId","");

c.setMaxAge(0);

response.addCookie(c);

5)cookie的編碼問題

cookie只能保存ascii字符,對於不合法的字符(比如中文)需進行編碼,即轉換成合法的ascii字符。

可使用URLEncoder.encode()方法和URLDecoder.decode()方法來進行這種轉換。

6)cookie的路徑問題

a,什麽是cookie的路徑問題?

瀏覽器在向服務器發送請求時,會比較cookie的路徑與要訪問的服務器的路徑是否匹配,只有匹配的cookie才會發送給服務器。

b, cookie的默認路徑

默認路徑等於創建該cookie的組件的路徑。

c,匹配規則

瀏覽器要訪問的路徑必須是cookie的路徑或其子路徑時,才會發送對應的cookie

d, 設置cookie的路徑cookie.setPath(String path);

比如 cookie.setPath("/web07");cookie的路徑一般設置為應用名,這樣可保證該cookie可被該應用的其它組件都能訪問到。

7) cookie的限制

a, cookie可被用戶禁止。

b, cookie不安全,敏感數據,比如密碼,帳號等等需加密。

c, cookie大小有限制,大約是4k左右(具體大小跟瀏覽器有關)

d, cookie個數有限制,大約是300(具體個數跟瀏覽器有關)

e, cookie只能夠保存字符串。

8)保存和查詢Cookie流程

a. 瀏覽器向服務器發送addCookie請求

服務器中的AddCookieServlet創建了兩個Cookiecookiecookie2

b. 服務器端執行語句response.addCookie(cookie);生成消息頭“set-cookie”,

並將兩個Cookie以鍵值對的方式(“name=aaa”、“passwd=123”)存放在消息頭中發 送給瀏覽器

c. 瀏覽器將Cookie信息保存到本地內存中

d. 瀏覽器繼續向服務器發送請求(帶著消息頭cookie

服務器端的FindCookieServlet找到Cookie信息,並顯示給瀏覽器

(4)session技術

1)什麽是session?

a, session是一種服務器端的狀態管理技術。

b, 當瀏覽器訪問服務器時,服務器創建一個session對象(該對象有一個唯一的id號,稱之為sessionId),服務器在默認情況下,會將sessionIdcookie的方式(set-cookie消息頭)發送給瀏覽器,瀏覽器會將sessionId保存到內存。當瀏覽器再次訪問服務器時,會將sessionId發送給服務器,服務器依據sessionId就可找到之前創建的session對象。

2)如何獲得session對象?

方式一:

HttpSession s = request.getSession(boolean flag);

flag=true:服務器會先查看請求當中有沒有sessionId,如沒有,則創建一個session對象。如有,會依據sessionId查找對應session對象,如找到,則返回該session對象,如找不到,則創建一個新的session對象。

flag = false時:服務器會先查看請求當中有沒有sessionId,如沒有,會返回null。如有,會依據sessionId查找對應session對象,如找到,則返回該session對象,如找不到,返回null

方式二:

HttpSession s = request.getSession();

等價於 request.getSession(true)

3)常用方法

String session.getId();

//obj類型最好實現Serializable接口,因為服務器在持久化session時,會使用java序列化協議。

session.setAttribute(String name,Object obj);

//name對應的值不存在,返回null

Object session.getAttribute(String name);

//解除綁定

session.removeAttribute(String name);

4)session超時

所謂session超時,指服務器會空閑時間過長的session對象從內存空間裏刪除掉。原因是,過多的session的對象會占用服務器過多的內存空間。大部分服務器都有一個缺省的超時限制,一般是30分鐘。可修改服務器的缺省的超時限制。

如,可修改tomcatweb.xml配置文件(conf/web.xml)

<session-config>

<session-timeout>30</session-timeout>

</session-config>

修改完之後,需要重新啟動服務器。

也可將以上配置放到某個應用的web.xml文件當中。

另外,還有一個方法:

session.setMaxInactiveInterval(int seconds);

5)刪除session

session.invalidate();

6)session案例:

a, session驗證

step1, 在登錄成功後,在session對象上綁定數據

比如: session.setAttribute("user",user);

step2, 對需保護的資源(只有登錄成功以後,才能訪問的資源,比如 main.jsp) ,添加session驗證代碼:

Object obj = session.getAttribute("user");

if(obj == null){

//跳轉到登錄頁面

}

我們在連接mysql數據庫時一般都在url後面添加 useUnicode=true&characterEncoding=UTF-8 ,但為啥要添加呢?

添加作用是:指定字符的編碼、解碼格式。

例如:mysql數據庫用gbk編碼,而項目數據庫用utf-8編碼。這時如添加useUnicode=true&characterEncoding=UTF-8 ,那麽作用有如下兩個方面:

1. 存數據時:

數據庫在存放項目數據時會先用UTF-8格式將數據解碼成字節碼,然後再將解碼後的字節碼重新使用GBK編碼存放到數據庫中。

2.取數據時:

在從數據庫中取數據時,數據庫會先將數據庫中的數據按GBK格式解碼成字節碼,然後再將解碼後的字節碼重新按UTF-8格式編碼數據,最後再將數據返回給客戶端。

註意:在xml配置文件中配置數據庫utl時,要使用&的轉義字符也就是&

例如:<property name="url" value="jdbc:mysql://localhost:3306/email?useUnicode=true&characterEncoding=UTF-8" />

1、用戶禁止cookie,如何繼續使用session?(了解)

(1)當用戶禁止cookie後,服務器仍會發送sessionId(set-cookie消息頭的方式),但瀏覽器會拒絕接受,這樣,session機制會失效。

(2)可使用url重寫來解決該問題

a,什麽是url重寫?

如某個組件需session機制支持,則不能直接使用該組件的地址去訪問,而應該使用服務器生成的組件的地址(會在組件的地址後面添加sessionId)去訪問。

b,如何重寫?

//用於鏈接地址,表單提交地址。

response.encodeURL(String url);

//用於重定向

response.encodeRedirectURL(String url);

比如:

response.sendRedirect(response.encodeRedirectURL("list.jsp"));

轉發不用考慮。

2session的優缺點

優點:

session相對安全

session能夠保存的數據類型更豐富

session能夠保存的數據大小更大

缺點:

session需要將所有數據寫在服務器端,所以,服務器會占用過多的內存空間。可考慮使用cookie來代替或使用數據庫來保存狀態(即數據)

servlet容器如何處理請求資源路徑?

比如,在瀏覽器地址欄輸入http://ip:port/web04/abc.html

請求資源路徑是: /web04/abc.html

1, 容器依據應用名找到應用所在的文件夾。

2,容器會假設要訪問的是一個servlet,會比較web.xml文件中<url-pattern>是否與"/abc.html"一致:

a,精確匹配:

b,通配符匹配:使用"*"來匹配任意的字符。比如<url-pattern>/*</url-pattern>

/aaa /aaa.bbb /aaa/bbb/ccc

c,後綴匹配:使用"*."開頭,後接任意的字符。比如<url-pattern>*.do</url-pattern>

會匹配所有以".do"結尾的請求。

3,如果都不匹配,容器會查找靜態頁面,如果找到,就返回,找不到,返回404

過濾器

(1)什麽是過濾器?

servlet規範當中定義的一種特殊的組件,用來攔截容器的調用過程並進行相應的處理。

(2)如何寫一個過濾器

step1,寫一個java類,實現Filter接口。

step2,將處理邏輯寫在doFilter方法裏面。

step3,配置過濾器(web.xml)

(3)過濾器的初始化參數

step1,web.xml,使用<init-param>配置初始化參數。

step2, 使用FilterConfig.getInitParameter(String paraname)來獲取初始化參數值。

(4)過濾器的優先級

當有多個過濾器都滿足過濾的條件,則容器依據<filter-mapping>的先後順序來調用過濾器。

(5)優點:

a,可將多個web組件相同或者相近的處理邏輯(比如,session驗證、權限的管理、編碼的處理等等)集中寫在過濾器裏面,方便代碼的維護。

b,可實現代碼的“可插拔性”:刪除或添加某些模塊,不會影響到整個程序正常運行。

<filter>

<filter-name>filter1</filter-name>

<filter-class>web.Filter1</filter-class>

<!-- 初始化參數 -->

<init-param>

<param-name>illegalStr</param-name>

<param-value>pig</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>filter1</filter-name>

<url-pattern>/comment</url-pattern>

</filter-mapping>

過濾器運行過程:

1) 瀏覽器發送請求給服務器

2) 服務器的Servlet引擎創建Request對象&&Response對象

3) Servlet引擎先調用過濾器的doFilter方法,該方法有兩個參數requestresponse

(在過濾器中可訪問到Request對象&&Response對象)

4) 過濾器對攔截的內容迚行處理

5) 之後調用SomeServletservice方法

6) service方法執行

7) service方法執行結束後,將結果返回到過濾器

8) 過濾器將service方法返回的結果再次迚行過濾

9) 最後,Servlet引擎將結果返回給瀏覽器

ServletContext的作用是什麽?

WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。

ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,

以通過ServletConfig.getServletContext方法獲得ServletContext對象。

由於一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊ServletContext對象通常被稱之為context域對象。

監聽器 **

1) 什麽是監聽器?

servlet規範當中定義的一種特殊的類,作用是監聽容器當中產生的一些事件並迚行相應的處 理。 容器產生的事件指的是兩大類事件:

第一大類 生命周期相關的事件,指的是當容器創建戒者銷毀request,session,ServletContext對象時產 生的事件。

第二大類 綁訂事件,指的是當調用request,session,ServletContext對象的 setAttribute,removeAttribute時產生的事件。

2) 如何寫監聽器

step1 寫一個java類,實現特定的監聽器接口類,如:HttpSessionListener (依據要監聽的事件類型)

step2 在接口聲明方法中,實現監聽的邏輯:

session對象一旦創建(就是訪問該應用,就創建了session對象)就會執行該方法--

因這兩個方法sessionCreatedsessionDestroyed都是重寫父類的

課堂例子演示的本質是session的數量隨著瀏覽器個數的變化而變化,

step3 配置(web.xml)

<listener>

<listener-class>web.CountListener</listener-class>

</listener>

3) ServletContext接口

web服務器在啟動時,會為每一個已部署的應用創建唯一的一個ServletContext實例。 該實例會一直存在,除非服務器關閉戒者應用被刪除。

註意:每個應用對應唯一的一個ServletContext實例

a. 如何獲得ServletContext實例。

GenericServlet提供了getServletContext()方法。

HttpSession提供了getServletContext()方法。

ServletConfig提供了getServletContext()方法。

b. 常用方法

ü 綁訂數據

setAttribute(String name,Object obj);

getAttribute(String name);

removeAttribute(String name);

ü

配置全局的初始化參數

step1 web.xml中,使用<context-param>配置的參數,可以被所有的servlet共享。

<context-param>

<param-name>version2</param-name>

<param-value>2</param-value>

</context-param>

step2 使用String ServletContext.getInitParameter(String paraName); 訪問全局的初始化參數

依據邏輯路徑獲得實際部署時的物理路徑:String ServletContext.getRealPath(String url);

註意:有先後順序的要求:1<context-param>2<listener>3<filter>4<servlet>

servlet線程安全問題

(1)servlet為什麽會有線程安全問題?

默認情況下,servlet在容器內部只有一個實例;如果有多個請求同時訪問某個servlet,容器會啟動多個線程來調用這個servlet實例,就有可能發生線程安全問題:比如,多個線程同時去修改servlet實例的某個屬性。

(2)如何解決?

a,使用synchronized關鍵字加鎖

b,servlet實現SingleThreadModel接口(不建議使用)容器會為每一個線程創建一個對應的servlet實例來處理請求。因為會產生過多的servlet實例,所以,建議少用。

javabean其實就是一個java類,不過他是有某些規定的java類,例如它有屬性,且屬性名為全小寫,對每個屬性有getset方法,叫做設置器與獲取器,這個類還必須有一個無參數的構造函數。
javabean的提出是為了實現可重用組件的需求提出的。其實jdk裏面的大部分類都是javabean。在通常情況下javabean被用作處理業務邏輯來使用。

cookie_session的詳細用法