cookie_session的詳細用法
相對路徑與絕對路徑
相對路徑:
鏈接地址 <a href="list.do"></a>
表單提交地址 <form action="add.do">
重定向 response.sendRedirect("list.jsp");
轉發 request.getRequestDispatcher("listEmp.jsp");
(1)什麽是相對路徑?
不以"/"開頭的路徑。
(2)什麽是絕對路徑?
以"/"開頭的路徑。
(3)怎樣寫絕對路徑?
鏈接地址、表單提交地址、重定向絕對路徑應從應用名開始寫,而轉發應從應用名之後開始。
獲得appname:String request.getContextPath()
如:
重定向——response.sendRedirect(/*重定向從應用名開始寫*/
request.getContextPath()
+ "/app3/sub/some.jsp");
/*轉發從應用名之後寫*/
轉發——request.getRequestDispatcher("/app3/sub/some.jsp")
.forward(request, response);*/
狀態管理
(1)什麽是狀態管理
將客戶端(瀏覽器)與服務器之間多次交互當作一個整體來看,並將多次交互所涉及的數據(狀態)保存下來。
(2)如何進行狀態管理
第一類方式:將狀態保存在客戶端(
第二類方式: 將狀態保存在服務器端(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
比如,要刪除一個名叫userId的cookie:
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創建了兩個Cookie:cookie和cookie2
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),服務器在默認情況下,會將sessionId以cookie的方式(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分鐘。可修改服務器的缺省的超時限制。
如,可修改tomcat的web.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"));
轉發不用考慮。
2、session的優缺點
優點:
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方法,該方法有兩個參數request和response,
(在過濾器中可訪問到Request對象&&Response對象)
4) 過濾器對攔截的內容迚行處理
5) 之後調用SomeServlet的service方法
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對象)就會執行該方法--
因這兩個方法sessionCreated,sessionDestroyed都是重寫父類的
課堂例子演示的本質是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類,例如它有屬性,且屬性名為全小寫,對每個屬性有get和set方法,叫做設置器與獲取器,這個類還必須有一個無參數的構造函數。
javabean的提出是為了實現可重用組件的需求提出的。其實jdk裏面的大部分類都是javabean。在通常情況下javabean被用作處理業務邏輯來使用。
cookie_session的詳細用法