国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

超詳細(xì)的Java面試題總結(jié)(四 )之JavaWeb基礎(chǔ)知識(shí)總結(jié)

Leo_chen / 2726人閱讀

摘要:系列文章請(qǐng)查看超詳細(xì)的面試題總結(jié)一之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)二之基礎(chǔ)知識(shí)篇超詳細(xì)的面試題總結(jié)三之集合篇常見問題下面的都是自己之前在學(xué)習(xí)的時(shí)候總結(jié)的,對(duì)于鞏固的基礎(chǔ)知識(shí)應(yīng)該有很大幫助。注意多線程的并發(fā)的讀寫類屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。

系列文章請(qǐng)查看:

超詳細(xì)的Java面試題總結(jié)(一)之Java基礎(chǔ)知識(shí)篇

超詳細(xì)的Java面試題總結(jié)(二)之Java基礎(chǔ)知識(shí)篇

超詳細(xì)的Java面試題總結(jié)(三)之Java集合篇常見問題

下面的都是自己之前在學(xué)習(xí)JavaWeb的時(shí)候總結(jié)的,對(duì)于鞏固JavaWeb的基礎(chǔ)知識(shí)應(yīng)該有很大幫助。后面還會(huì)把框架的面試題總結(jié)一下。

Servlet總結(jié)

在Java Web程序中,Servlet主要負(fù)責(zé)接收用戶請(qǐng)求HttpServletRequest,在doGet(),doPost()中做相應(yīng)的處理,并將回應(yīng)HttpServletResponse反饋給用戶。Servlet可以設(shè)置初始化參數(shù),供Servlet內(nèi)部使用。一個(gè)Servlet類只會(huì)有一個(gè)實(shí)例,在它初始化時(shí)調(diào)用init()方法,銷毀時(shí)調(diào)用destroy()方法。Servlet需要在web.xml中配置(MyEclipse中創(chuàng)建Servlet會(huì)自動(dòng)配置),一個(gè)Servlet可以設(shè)置多個(gè)URL訪問Servlet不是線程安全,因此要謹(jǐn)慎使用類變量。

闡述Servlet和CGI的區(qū)別?

CGI的不足之處:

1,需要為每個(gè)請(qǐng)求啟動(dòng)一個(gè)操作CGI程序的系統(tǒng)進(jìn)程。如果請(qǐng)求頻繁,這將會(huì)帶來很大的開銷。

2,需要為每個(gè)請(qǐng)求加載和運(yùn)行一個(gè)CGI程序,這將帶來很大的開銷

3,需要重復(fù)編寫處理網(wǎng)絡(luò)協(xié)議的代碼以及編碼,這些工作都是非常耗時(shí)的。

Servlet的優(yōu)點(diǎn):

1,只需要啟動(dòng)一個(gè)操作系統(tǒng)進(jìn)程以及加載一個(gè)JVM,大大降低了系統(tǒng)的開銷

2,如果多個(gè)請(qǐng)求需要做同樣處理的時(shí)候,這時(shí)候只需要加載一個(gè)類,這也大大降低了開銷

3,所有動(dòng)態(tài)加載的類可以實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)協(xié)議以及請(qǐng)求解碼的共享,大大降低了工作量。

4,Servlet能直接和Web服務(wù)器交互,而普通的CGI程序不能。Servlet還能在各個(gè)程序之間共享數(shù)據(jù),使數(shù)據(jù)庫連接池之類的功能很容易實(shí)現(xiàn)。

補(bǔ)充:Sun Microsystems公司在1996年發(fā)布Servlet技術(shù)就是為了和CGI進(jìn)行競(jìng)爭,Servlet是一個(gè)特殊的Java程序,一個(gè)基于Java的Web應(yīng)用通常包含一個(gè)或多個(gè)Servlet類。Servlet不能夠自行創(chuàng)建并執(zhí)行,它是在Servlet容器中運(yùn)行的,容器將用戶的請(qǐng)求傳遞給Servlet程序,并將Servlet的響應(yīng)回傳給用戶。通常一個(gè)Servlet會(huì)關(guān)聯(lián)一個(gè)或多個(gè)JSP頁面。以前CGI經(jīng)常因?yàn)樾阅荛_銷上的問題被詬病,然而Fast CGI早就已經(jīng)解決了CGI效率上的問題,所以面試的時(shí)候大可不必信口開河的詬病CGI,事實(shí)上有很多你熟悉的網(wǎng)站都使用了CGI技術(shù)。

參考:《javaweb整合開發(fā)王者歸來》P7

Servlet接口中有哪些方法及Servlet生命周期探秘

Servlet接口定義了5個(gè)方法,其中前三個(gè)方法與Servlet生命周期相關(guān)

void init(ServletConfig config) throws ServletException

void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException

void destory()

java.lang.String getServletInfo()

ServletConfig getServletConfig()

生命周期: Web容器加載Servlet并將其實(shí)例化后,Servlet生命周期開始,容器運(yùn)行其init()方法進(jìn)行Servlet的初始化;請(qǐng)求到達(dá)時(shí)調(diào)用Servlet的service()方法,service()方法會(huì)根據(jù)需要調(diào)用與請(qǐng)求對(duì)應(yīng)的doGet或doPost等方法;當(dāng)服務(wù)器關(guān)閉或項(xiàng)目被卸載時(shí)服務(wù)器會(huì)將Servlet實(shí)例銷毀,此時(shí)會(huì)調(diào)用Servlet的destroy()方法。init方法和destory方法只會(huì)執(zhí)行一次,service方法客戶端每次請(qǐng)求Servlet都會(huì)執(zhí)行。Servlet中有時(shí)會(huì)用到一些需要初始化與銷毀的資源,因此可以把初始化資源的代碼放入init方法中,銷毀資源的代碼放入destroy方法中,這樣就不需要每次處理客戶端的請(qǐng)求都要初始化與銷毀資源。

參考:《javaweb整合開發(fā)王者歸來》P81

get和post請(qǐng)求的區(qū)別?

①get請(qǐng)求用來從服務(wù)器上獲得資源,而post是用來向服務(wù)器提交數(shù)據(jù);

②get將表單中數(shù)據(jù)按照name=value的形式,添加到action 所指向的URL 后面,并且兩者使用"?"連接,而各個(gè)變量之間使用"&"連接;post是將表單中的數(shù)據(jù)放在HTTP協(xié)議的請(qǐng)求頭或消息體中,傳遞到action所指向URL;

③get傳輸?shù)臄?shù)據(jù)要受到URL長度限制(1024字節(jié)即256個(gè)字符);而post可以傳輸大量的數(shù)據(jù),上傳文件通常要使用post方式;

④使用get時(shí)參數(shù)會(huì)顯示在地址欄上,如果這些數(shù)據(jù)不是敏感數(shù)據(jù),那么可以使用get;對(duì)于敏感數(shù)據(jù)還是應(yīng)用使用post;

⑤get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號(hào)編碼)文本的格式傳遞參數(shù),保證被傳送的參數(shù)由遵循規(guī)范的文本組成,例如一個(gè)空格的編碼是"%20"。

補(bǔ)充:GET方式提交表單的典型應(yīng)用是搜索引擎。GET方式就是被設(shè)計(jì)為查詢用的。

什么情況下調(diào)用doGet()和doPost()?

Form標(biāo)簽里的method的屬性為get時(shí)調(diào)用doGet(),為post時(shí)調(diào)用doPost()。

轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別?

轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。

轉(zhuǎn)發(fā)(Forword)
通過RequestDispatcher對(duì)象的forward(HttpServletRequest request,HttpServletResponse response)方法實(shí)現(xiàn)的。RequestDispatcher可以通過HttpServletRequest 的getRequestDispatcher()方法獲得。例如下面的代碼就是跳轉(zhuǎn)到login_success.jsp頁面。

     request.getRequestDispatcher("login_success.jsp").forward(request, response);

重定向(Redirect) 是利用服務(wù)器返回的狀態(tài)嗎來實(shí)現(xiàn)的??蛻舳藶g覽器請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器會(huì)返回一個(gè)狀態(tài)碼。服務(wù)器通過HttpServletRequestResponse的setStatus(int status)方法設(shè)置狀態(tài)碼。如果服務(wù)器返回301或者302,則瀏覽器會(huì)到新的網(wǎng)址重新請(qǐng)求該資源。

從地址欄顯示來說

forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,所以它的地址欄還是原來的地址.
redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.

從數(shù)據(jù)共享來說

forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù).
redirect:不能共享數(shù)據(jù).

從運(yùn)用地方來說

forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊.
redirect:一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等

從效率來說

forward:高.
redirect:低.

自動(dòng)刷新(Refresh)

自動(dòng)刷新不僅可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)跳轉(zhuǎn)到另一個(gè)頁面,還可以實(shí)現(xiàn)一段時(shí)間之后自動(dòng)刷新本頁面。Servlet中通過HttpServletResponse對(duì)象設(shè)置Header屬性實(shí)現(xiàn)自動(dòng)刷新例如:

Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");

其中1000為時(shí)間,單位為毫秒。URL指定就是要跳轉(zhuǎn)的頁面(如果設(shè)置自己的路徑,就會(huì)實(shí)現(xiàn)沒過一秒自動(dòng)刷新本頁面一次)

Servlet與線程安全

Servlet不是線程安全的,多線程并發(fā)的讀寫會(huì)導(dǎo)致數(shù)據(jù)不同步的問題。 解決的辦法是盡量不要定義name屬性,而是要把name變量分別定義在doGet()和doPost()方法內(nèi)。雖然使用synchronized(name){}語句塊可以解決問題,但是會(huì)造成線程的等待,不是很科學(xué)的辦法。
注意:多線程的并發(fā)的讀寫Servlet類屬性會(huì)導(dǎo)致數(shù)據(jù)不同步。但是如果只是并發(fā)地讀取屬性而不寫入,則不存在數(shù)據(jù)不同步的問題。因此Servlet里的只讀屬性最好定義為final類型的。

參考:《javaweb整合開發(fā)王者歸來》P92

JSP和Servlet是什么關(guān)系?

其實(shí)這個(gè)問題在上面已經(jīng)闡述過了,Servlet是一個(gè)特殊的Java程序,它運(yùn)行于服務(wù)器的JVM中,能夠依靠服務(wù)器的支持向?yàn)g覽器提供顯示內(nèi)容。JSP本質(zhì)上是Servlet的一種簡易形式,JSP會(huì)被服務(wù)器處理成一個(gè)類似于Servlet的Java程序,可以簡化頁面內(nèi)容的生成。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML分離開來。而JSP的情況是Java和HTML可以組合成一個(gè)擴(kuò)展名為.jsp的文件。有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當(dāng)然這個(gè)說法是很片面且不夠準(zhǔn)確的。JSP側(cè)重于視圖,Servlet更側(cè)重于控制邏輯,在MVC架構(gòu)模式中,JSP適合充當(dāng)視圖(view)而Servlet適合充當(dāng)控制器(controller)。

JSP工作原理:

JSP是一種Servlet,但是與HttpServlet的工作方式不太一樣。HttpServlet是先由源代碼編譯為class文件后部署到服務(wù)器下,為先編譯后部署。而JSP則是先部署后編譯。JSP會(huì)在客戶端第一次請(qǐng)求JSP文件時(shí)被編譯為HttpJspPage類(接口Servlet的一個(gè)子類)。該類會(huì)被服務(wù)器臨時(shí)存放在服務(wù)器工作目錄里面。下面通過實(shí)例給大家介紹。
工程JspLoginDemo下有一個(gè)名為login.jsp的Jsp文件,把工程第一次部署到服務(wù)器上后訪問這個(gè)Jsp文件,我們發(fā)現(xiàn)這個(gè)目錄下多了下圖這兩個(gè)東東。
.class文件便是JSP對(duì)應(yīng)的Servlet。編譯完畢后再運(yùn)行class文件來響應(yīng)客戶端請(qǐng)求。以后客戶端訪問login.jsp的時(shí)候,Tomcat將不再重新編譯JSP文件,而是直接調(diào)用class文件來響應(yīng)客戶端請(qǐng)求。

由于JSP只會(huì)在客戶端第一次請(qǐng)求的時(shí)候被編譯 ,因此第一次請(qǐng)求JSP時(shí)會(huì)感覺比較慢,之后就會(huì)感覺快很多。如果把服務(wù)器保存的class文件刪除,服務(wù)器也會(huì)重新編譯JSP。

開發(fā)Web程序時(shí)經(jīng)常需要修改JSP。Tomcat能夠自動(dòng)檢測(cè)到JSP程序的改動(dòng)。如果檢測(cè)到JSP源代碼發(fā)生了改動(dòng)。Tomcat會(huì)在下次客戶端請(qǐng)求JSP時(shí)重新編譯JSP,而不需要重啟Tomcat。這種自動(dòng)檢測(cè)功能是默認(rèn)開啟的,檢測(cè)改動(dòng)會(huì)消耗少量的時(shí)間,在部署Web應(yīng)用的時(shí)候可以在web.xml中將它關(guān)掉。

參考:《javaweb整合開發(fā)王者歸來》P97

JSP有哪些內(nèi)置對(duì)象?作用分別是什么?

JSP內(nèi)置對(duì)象 - CSDN博客

JSP有9個(gè)內(nèi)置對(duì)象:

request:封裝客戶端的請(qǐng)求,其中包含來自GET或POST請(qǐng)求的參數(shù);

response:封裝服務(wù)器對(duì)客戶端的響應(yīng);

pageContext:通過該對(duì)象可以獲取其他對(duì)象;

session:封裝用戶會(huì)話的對(duì)象;

application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象;

out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象;

config:Web應(yīng)用的配置對(duì)象;

page:JSP頁面本身(相當(dāng)于Java程序中的this);

exception:封裝頁面拋出異常的對(duì)象。

Request對(duì)象的主要方法有哪些?

setAttribute(String name,Object):設(shè)置名字為name的request 的參數(shù)值

getAttribute(String name):返回由name指定的屬性值

getAttributeNames():返回request 對(duì)象所有屬性的名字集合,結(jié)果是一個(gè)枚舉的實(shí)例

getCookies():返回客戶端的所有 Cookie 對(duì)象,結(jié)果是一個(gè)Cookie 數(shù)組

getCharacterEncoding() :返回請(qǐng)求中的字符編碼方式 = getContentLength() :返回請(qǐng)求的 Body的長度

getHeader(String name) :獲得HTTP協(xié)議定義的文件頭信息

getHeaders(String name) :返回指定名字的request Header 的所有值,結(jié)果是一個(gè)枚舉的實(shí)例

getHeaderNames() :返回所以request Header 的名字,結(jié)果是一個(gè)枚舉的實(shí)例

getInputStream() :返回請(qǐng)求的輸入流,用于獲得請(qǐng)求中的數(shù)據(jù)

getMethod() :獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法

getParameter(String name) :獲得客戶端傳送給服務(wù)器端的有 name指定的參數(shù)值

getParameterNames() :獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字,結(jié)果是一個(gè)枚舉的實(shí)例

getParameterValues(String name):獲得有name指定的參數(shù)的所有值

getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱

getQueryString() :獲得查詢字符串

getRequestURI() :獲取發(fā)出請(qǐng)求字符串的客戶端地址

getRemoteAddr():獲取客戶端的 IP 地址

getRemoteHost() :獲取客戶端的名字

getSession([Boolean create]) :返回和請(qǐng)求相關(guān) Session

getServerName() :獲取服務(wù)器的名字

getServletPath():獲取客戶端所請(qǐng)求的腳本文件的路徑

getServerPort():獲取服務(wù)器的端口號(hào)

removeAttribute(String name):刪除請(qǐng)求中的一個(gè)屬性

request.getAttribute()和 request.getParameter()有何區(qū)別?

從獲取方向來看:

getParameter()是獲取 POST/GET 傳遞的參數(shù)值;

getAttribute()是獲取對(duì)象容器中的數(shù)據(jù)值;

從用途來看:

getParameter用于客戶端重定向時(shí),即點(diǎn)擊了鏈接或提交按扭時(shí)傳值用,即用于在用表單或url重定向傳值時(shí)接收數(shù)據(jù)用。

getAttribute用于服務(wù)器端重定向時(shí),即在 sevlet 中使用了 forward 函數(shù),或 struts 中使用了
mapping.findForward。 getAttribute 只能收到程序用 setAttribute 傳過來的值。

另外,可以用 setAttribute,getAttribute 發(fā)送接收對(duì)象.而 getParameter 顯然只能傳字符串。
setAttribute 是應(yīng)用服務(wù)器把這個(gè)對(duì)象放在該頁面所對(duì)應(yīng)的一塊內(nèi)存中去,當(dāng)你的頁面服務(wù)器重定向到另一個(gè)頁面時(shí),應(yīng)用服務(wù)器會(huì)把這塊內(nèi)存拷貝另一個(gè)頁面所對(duì)應(yīng)的內(nèi)存中。這樣getAttribute就能取得你所設(shè)下的值,當(dāng)然這種方法可以傳對(duì)象。session也一樣,只是對(duì)象在內(nèi)存中的生命周期不一樣而已。getParameter只是應(yīng)用服務(wù)器在分析你送上來的 request頁面的文本時(shí),取得你設(shè)在表單或 url 重定向時(shí)的值。

總結(jié):

getParameter 返回的是String,用于讀取提交的表單中的值;(獲取之后會(huì)根據(jù)實(shí)際需要轉(zhuǎn)換為自己需要的相應(yīng)類型,比如整型,日期類型啊等等)

getAttribute 返回的是Object,需進(jìn)行轉(zhuǎn)換,可用setAttribute 設(shè)置成任意對(duì)象,使用很靈活,可隨時(shí)用

include指令include的行為的區(qū)別

include指令: JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會(huì)被同時(shí)編譯執(zhí)行。 語法格式如下:
<%@ include file="文件相對(duì) url 地址" %>

include動(dòng)作: 動(dòng)作元素用來包含靜態(tài)和動(dòng)態(tài)的文件。該動(dòng)作把指定文件插入正在生成的頁面。語法格式如下:

JSP九大內(nèi)置對(duì)象,七大動(dòng)作,三大指令-

JSP九大內(nèi)置對(duì)象,七大動(dòng)作,三大指令總結(jié)

講解JSP中的四種作用域

JSP中的四種作用域包括page、request、session和application,具體來說:

page代表與一個(gè)頁面相關(guān)的對(duì)象和屬性。

request代表與Web客戶機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多個(gè)頁面,涉及多個(gè)Web組件;需要在頁面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域。

session代表與某個(gè)用戶與服務(wù)器建立的一次會(huì)話相關(guān)的對(duì)象和屬性。跟某個(gè)用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中。

application代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性,它實(shí)質(zhì)上是跨越整個(gè)Web應(yīng)用程序,包括多個(gè)頁面、請(qǐng)求和會(huì)話的一個(gè)全局作用域。

如何實(shí)現(xiàn)JSP或Servlet的單線程模式?

對(duì)于JSP頁面,可以通過page指令進(jìn)行設(shè)置。
<%@page isThreadSafe=”false”%>

對(duì)于Servlet,可以讓自定義的Servlet實(shí)現(xiàn)SingleThreadModel標(biāo)識(shí)接口。

說明:如果將JSP或Servlet設(shè)置成單線程工作模式,會(huì)導(dǎo)致每個(gè)請(qǐng)求創(chuàng)建一個(gè)Servlet實(shí)例,這種實(shí)踐將導(dǎo)致嚴(yán)重的性能問題(服務(wù)器的內(nèi)存壓力很大,還會(huì)導(dǎo)致頻繁的垃圾回收),所以通常情況下并不會(huì)這么做。

實(shí)現(xiàn)會(huì)話跟蹤的技術(shù)有哪些?

使用Cookie

向客戶端發(fā)送Cookie

Cookie c =new Cookie("name","value"); //創(chuàng)建Cookie 
c.setMaxAge(60*60*24); //設(shè)置最大時(shí)效,此處設(shè)置的最大時(shí)效為一天
response.addCookie(c); //把Cookie放入到HTTP響應(yīng)中

從客戶端讀取Cookie

String name ="name"; 
Cookie[]cookies =request.getCookies(); 
if(cookies !=null){ 
   for(int i= 0;i

優(yōu)點(diǎn): 數(shù)據(jù)可以持久保存,不需要服務(wù)器資源,簡單,基于文本的Key-Value

缺點(diǎn): 大小受到限制,用戶可以禁用Cookie功能,由于保存在本地,有一定的安全風(fēng)險(xiǎn)。

URL 重寫

在URL中添加用戶會(huì)話的信息作為請(qǐng)求的參數(shù),或者將唯一的會(huì)話ID添加到URL結(jié)尾以標(biāo)識(shí)一個(gè)會(huì)話。

優(yōu)點(diǎn): 在Cookie被禁用的時(shí)候依然可以使用

缺點(diǎn): 必須對(duì)網(wǎng)站的URL進(jìn)行編碼,所有頁面必須動(dòng)態(tài)生成,不能用預(yù)先記錄下來的URL進(jìn)行訪問。

3.隱藏的表單域

優(yōu)點(diǎn): Cookie被禁時(shí)可以使用

缺點(diǎn): 所有頁面必須是表單提交之后的結(jié)果。

HttpSession

在所有會(huì)話跟蹤技術(shù)中,HttpSession對(duì)象是最強(qiáng)大也是功能最多的。當(dāng)一個(gè)用戶第一次訪問某個(gè)網(wǎng)站時(shí)會(huì)自動(dòng)創(chuàng)建 HttpSession,每個(gè)用戶可以訪問他自己的HttpSession??梢酝ㄟ^HttpServletRequest對(duì)象的getSession方 法獲得HttpSession,通過HttpSession的setAttribute方法可以將一個(gè)值放在HttpSession中,通過調(diào)用 HttpSession對(duì)象的getAttribute方法,同時(shí)傳入屬性名就可以獲取保存在HttpSession中的對(duì)象。與上面三種方式不同的 是,HttpSession放在服務(wù)器的內(nèi)存中,因此不要將過大的對(duì)象放在里面,即使目前的Servlet容器可以在內(nèi)存將滿時(shí)將HttpSession 中的對(duì)象移到其他存儲(chǔ)設(shè)備中,但是這樣勢(shì)必影響性能。添加到HttpSession中的值可以是任意Java對(duì)象,這個(gè)對(duì)象最好實(shí)現(xiàn)了 Serializable接口,這樣Servlet容器在必要的時(shí)候可以將其序列化到文件中,否則在序列化時(shí)就會(huì)出現(xiàn)異常。

Cookie和Session的的區(qū)別?

由于HTTP協(xié)議是無狀態(tài)的協(xié)議,所以服務(wù)端需要記錄用戶的狀態(tài)時(shí),就需要用某種機(jī)制來識(shí)具體的用戶,這個(gè)機(jī)制就是Session.典型的場(chǎng)景比如購物車,當(dāng)你點(diǎn)擊下單按鈕時(shí),由于HTTP協(xié)議無狀態(tài),所以并不知道是哪個(gè)用戶操作的,所以服務(wù)端要為特定的用戶創(chuàng)建了特定的Session,用用于標(biāo)識(shí)這個(gè)用戶,并且跟蹤用戶,這樣才知道購物車?yán)锩嬗袔妆緯_@個(gè)Session是保存在服務(wù)端的,有一個(gè)唯一標(biāo)識(shí)。在服務(wù)端保存Session的方法很多,內(nèi)存、數(shù)據(jù)庫、文件都有。集群的時(shí)候也要考慮Session的轉(zhuǎn)移,在大型的網(wǎng)站,一般會(huì)有專門的Session服務(wù)器集群,用來保存用戶會(huì)話,這個(gè)時(shí)候 Session 信息都是放在內(nèi)存的,使用一些緩存服務(wù)比如Memcached之類的來放 Session。

思考一下服務(wù)端如何識(shí)別特定的客戶?這個(gè)時(shí)候Cookie就登場(chǎng)了。每次HTTP請(qǐng)求的時(shí)候,客戶端都會(huì)發(fā)送相應(yīng)的Cookie信息到服務(wù)端。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來實(shí)現(xiàn)Session跟蹤的,第一次創(chuàng)建Session的時(shí)候,服務(wù)端會(huì)在HTTP協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個(gè)Session ID,以后每次請(qǐng)求把這個(gè)會(huì)話ID發(fā)送到服務(wù)器,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下,會(huì)使用一種叫做URL重寫的技術(shù)來進(jìn)行會(huì)話跟蹤,即每次HTTP交互,URL后面都會(huì)被附加上一個(gè)諸如 sid=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識(shí)別用戶。

Cookie其實(shí)還可以用在一些方便用戶的場(chǎng)景下,設(shè)想你某次登陸過一個(gè)網(wǎng)站,下次登錄的時(shí)候不想再次輸入賬號(hào)了,怎么辦?這個(gè)信息可以寫到Cookie里面,訪問網(wǎng)站的時(shí)候,網(wǎng)站頁面的腳本可以讀取這個(gè)信息,就自動(dòng)幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點(diǎn)甜頭。所以,總結(jié)一下:Session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來跟蹤用戶的狀態(tài),這個(gè)數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫、文件中;Cookie是客戶端保存用戶信息的一種機(jī)制,用來記錄用戶的一些信息,也是實(shí)現(xiàn)Session的一種方式。

參考:

https://www.zhihu.com/questio...

《javaweb整合開發(fā)王者歸來》P158 Cookie和Session的比較

歡迎關(guān)注我的微信公眾號(hào):"Java面試通關(guān)手冊(cè)"(堅(jiān)持原創(chuàng),分享各種Java學(xué)習(xí)資源,面試題,優(yōu)質(zhì)文章,以及企業(yè)級(jí)Java實(shí)戰(zhàn)項(xiàng)目回復(fù)關(guān)鍵字免費(fèi)領(lǐng)?。海?/strong>

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68957.html

相關(guān)文章

  • 一份送給Java初學(xué)者指南

    摘要:編程思想第版這本書要常讀,初學(xué)者可以快速概覽,中等程序員可以深入看看,老鳥還可以用之回顧的體系。以下視頻整理自慕課網(wǎng)工程師路徑相關(guān)免費(fèi)課程。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問題,目前已經(jīng)開源,會(huì)一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java-Guide 筆者建議初學(xué)者學(xué)習(xí)Java的方式:看書+視頻+實(shí)踐(初...

    banana_pi 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • 詳細(xì)Java面試總結(jié)(二)Java基礎(chǔ)知識(shí)

    摘要:超詳細(xì)的面試題總結(jié)一之基本知識(shí)多線程和虛擬機(jī)創(chuàng)建線程有幾種不同的方式你喜歡哪一種為什么繼承類實(shí)現(xiàn)接口應(yīng)用程序可以使用框架來創(chuàng)建線程池實(shí)現(xiàn)接口。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。 超詳細(xì)的Java面試題總結(jié)(一)之Java基本知識(shí) 多線程和Java虛擬機(jī) 創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么? 繼承Thread類 實(shí)現(xiàn)R...

    wangjuntytl 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡單 注解就這么簡單 Druid數(shù)據(jù)庫連接池...

    KevinYan 評(píng)論0 收藏0
  • 詳細(xì)Java面試總結(jié)(一)Java基礎(chǔ)知識(shí)

    摘要:最近在備戰(zhàn)面試的過程中,整理一下面試題。成員變量如果沒有被賦初值,則會(huì)自動(dòng)以類型的默認(rèn)值而賦值一種情況例外被修飾但沒有被修飾的成員變量必須顯示地賦值而局部變量則不會(huì)自動(dòng)賦值。   最近在備戰(zhàn)面試的過程中,整理一下面試題。大多數(shù)題目都是自己手敲的,網(wǎng)上也有很多這樣的總結(jié)。自己感覺總是很亂,所以花了很久把自己覺得重要的東西總結(jié)了一下。 面向?qū)ο蠛兔嫦蜻^程的區(qū)別 面向過程:  優(yōu)點(diǎn):性能比面...

    vpants 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<