2018-12-19 javaEE基礎(chǔ)

1.Servlet

Servlet總結(jié):在JavaWeb當(dāng)中渊胸,Servlet的作用是接受用戶(hù)請(qǐng)求HttpServletRequest看峻,在doPost(),doGet()當(dāng)中做響應(yīng)的處理如输,然后將回應(yīng)HTTPServletResponse返回給用戶(hù)偏序,Servlet可以設(shè)置初始化參數(shù)卦溢,供Servlet內(nèi)部使用佳鳖,一個(gè)Servlet類(lèi)只會(huì)有一個(gè)實(shí)例,他在初始化的時(shí)候調(diào)用init()方法棚赔,銷(xiāo)毀的時(shí)候調(diào)用destroy()方法Servlet需要在web.xml 當(dāng)中配置(myeclipse會(huì)自動(dòng)的配置)帝簇,一個(gè)servlet可以配置多個(gè)訪(fǎng)問(wèn)路徑URL,它不是線(xiàn)程安全的靠益,要謹(jǐn)慎設(shè)置成員變量己儒。

2.servlet當(dāng)中的方法有哪些?servlet的生命周期

servlet接口定義了5個(gè)方法

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()

Servlet的生命周期:
web容器記載servlet并將其實(shí)例化之后,Servlet的生命周期開(kāi)始捆毫,容器首先運(yùn)行init()方法,加載一些初始化信息冲甘,當(dāng)在請(qǐng)求到達(dá)的時(shí)候調(diào)用他的service()方法绩卤,service根據(jù)請(qǐng)求的方式調(diào)用響應(yīng)的doPost(),doGet()方法,當(dāng)服務(wù)器關(guān)閉或者項(xiàng)目被卸載之后江醇,就會(huì)執(zhí)行destroy()方法濒憋。init方法和destory方法只會(huì)執(zhí)行一次,service方法客戶(hù)端每次請(qǐng)求Servlet都會(huì)執(zhí)行陶夜。Servlet中有時(shí)會(huì)用到一些需要初始化與銷(xiāo)毀的資源凛驮,因此可以把初始化資源的代碼放入init方法中,銷(xiāo)毀資源的代碼放入destroy方法中条辟,這樣就不需要每次處理客戶(hù)端的請(qǐng)求都要初始化與銷(xiāo)毀資源黔夭。

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

1.post請(qǐng)求用來(lái)向服務(wù)器提交數(shù)據(jù)宏胯,get請(qǐng)求用來(lái)獲得服務(wù)器當(dāng)中的數(shù)據(jù)
2.get將表單中數(shù)據(jù)按照name=value的形式,添加到action 所指向的URL 后面本姥,并且兩者使用"?"連接肩袍,而各個(gè)變量之間使用"&"連接;post是將表單中的數(shù)據(jù)放在HTTP協(xié)議的請(qǐng)求頭或消息體中婚惫,傳遞到action所指向URL氛赐;
3.get傳輸?shù)臄?shù)據(jù)要受到URL長(zhǎng)度限制(1024字節(jié)即256個(gè)字符);而post可以傳輸大量的數(shù)據(jù)先舷,上傳文件通常要使用post方式
4.使用get時(shí)參數(shù)會(huì)顯示在地址欄上艰管,如果這些數(shù)據(jù)不是敏感數(shù)據(jù),那么可以使用get蒋川;對(duì)于敏感數(shù)據(jù)還是應(yīng)用使用post牲芋;
5.GET方式提交表單的典型應(yīng)用是搜索引擎。GET方式就是被設(shè)計(jì)為查詢(xún)用的尔破。

4.請(qǐng)求轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別?

forward是服務(wù)器的行為街图,redirect是瀏覽器行為

1.從地址欄顯示來(lái)說(shuō)

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

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

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

2.從數(shù)據(jù)共享來(lái)說(shuō)

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

3.從運(yùn)用地方來(lái)說(shuō)

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

4.從效率來(lái)說(shuō)

forward:高. redirect:低.

5.自動(dòng)刷新

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

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

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

5.Servlet與線(xiàn)程安全

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

Servlet是一個(gè)特殊的Java程序,它運(yùn)行于服務(wù)器的JVM中,能夠依靠服務(wù)器的支持向?yàn)g覽器提供顯示內(nèi)容

JSP本質(zhì)上是servlet既们,在瀏覽器請(qǐng)求一個(gè)JSP頁(yè)面的時(shí)候濒析,服務(wù)器會(huì)把他處理成servlet,可以簡(jiǎn)化頁(yè)面內(nèi)容的生成贤壁,JSP的出現(xiàn)是為了緩解在java代碼當(dāng)中書(shū)寫(xiě)HTML代碼的復(fù)雜度而出現(xiàn)的悼枢,

JSP側(cè)重于視圖,servlet側(cè)重于邏輯控制脾拆,在MVC邏輯架構(gòu)當(dāng)中馒索,JSP適合充當(dāng)視圖,Servlet適合充當(dāng)控制器名船。

6.JSP的工作原理

JSP是一種servlet绰上,但是與servlet的工作原理不一樣,Servlet是先編譯為.class文件渠驼,再部署蜈块,JSP是先部署,在編譯迷扇。JSP會(huì)在客戶(hù)端第一次請(qǐng)求JSP文件時(shí)被編譯為HttpJspPage類(lèi)(接口Servlet的一個(gè)子類(lèi))百揭,故在第一次訪(fǎng)問(wèn)JSP頁(yè)面的時(shí)候可以明顯感覺(jué)到速度很慢,如果把服務(wù)器保存的class文件刪除蜓席,服務(wù)器也會(huì)重新編譯JSP器一。該類(lèi)會(huì)被服務(wù)器臨時(shí)存放在服務(wù)器工作目錄里面。

比如:工程JspLoginDemo下有一個(gè)名為login.jsp的Jsp文件,把工程第一次部署到服務(wù)器上后訪(fǎng)問(wèn)這個(gè)Jsp文件厨内,我們發(fā)現(xiàn)這個(gè)目錄下多了下圖這兩個(gè)東東祈秕。 .class文件便是JSP對(duì)應(yīng)的Servlet。編譯完畢后再運(yùn)行class文件來(lái)響應(yīng)客戶(hù)端請(qǐng)求雏胃。以后客戶(hù)端訪(fǎng)問(wèn)login.jsp的時(shí)候请毛,Tomcat將不再重新編譯JSP文件,而是直接調(diào)用class文件來(lái)響應(yīng)客戶(hù)端請(qǐng)求瞭亮。 
圖片.png

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

7.JSP九大內(nèi)置對(duì)象

引用:https://blog.csdn.net/qq_34337272/article/details/64310849

(一)在JSP當(dāng)中沒(méi)有定義就可以直接使用的對(duì)象面徽,稱(chēng)為內(nèi)置對(duì)象。

request:封裝客戶(hù)端的請(qǐng)求,其中包含來(lái)自GET或POST請(qǐng)求的參數(shù)趟紊;
response:封裝服務(wù)器對(duì)客戶(hù)端的響應(yīng)氮双;
pageContext頁(yè)面上下文對(duì)象:隱藏對(duì)象pageContext為javax.servlet.jsp.PageContext類(lèi)的實(shí)例。pageContext對(duì)象代表當(dāng)前JSP頁(yè)面編譯后的內(nèi)容霎匈。通過(guò)pageContext能夠獲取到JSP中的資源
session:封裝用戶(hù)會(huì)話(huà)的對(duì)象戴差;
application:封裝服務(wù)器運(yùn)行環(huán)境的對(duì)象。隱藏對(duì)象application是javax.servlet.ServletContext類(lèi)的對(duì)象铛嘱。application封裝JSP所在Web應(yīng)用程序的信息暖释,例如web.xml中國(guó)配置的全局的初始化信息。Servlet中application對(duì)象需要通過(guò)ServletConfig.getServletContext()來(lái)獲取墨吓。整個(gè)Web應(yīng)用程序?qū)?yīng)一個(gè)application對(duì)象

out:輸出服務(wù)器響應(yīng)的輸出流對(duì)象球匕;
config:Web應(yīng)用的配置對(duì)象,隱藏對(duì)象config是javax.servlet.ServletConfig類(lèi)的實(shí)例,ServletConfig封裝了配置在web.xml中初始化JSP的參數(shù)帖烘。JSP中通過(guò)config獲取這些參數(shù)亮曹。每個(gè)JSP文件中共有一個(gè)config對(duì)象;
page:隱藏對(duì)象page是javax.servlet.jsp.HttpJspPage類(lèi)的實(shí)例秘症。page對(duì)象代表當(dāng)前JSP頁(yè)面照卦,是當(dāng)前JSP編譯后的Servlet類(lèi)的對(duì)象。page想當(dāng)于Java類(lèi)中的關(guān)鍵字this
exception:封裝頁(yè)面拋出異常的對(duì)象乡摹。

(二)request對(duì)象詳解

1.方法:

setAttribute(String name,Object):設(shè)置名字為name的request 的參數(shù)值
getAttribute(String name):返回由name指定的屬性值
getAttributeNames():返回request 對(duì)象所有屬性的名字集合役耕,結(jié)果是一個(gè)枚舉的實(shí)例
getCookies():返回客戶(hù)端的所有 Cookie 對(duì)象,結(jié)果是一個(gè)Cookie 數(shù)組
getCharacterEncoding() :返回請(qǐng)求中的字符編碼方式 = getContentLength() :返回請(qǐng)求的 Body的長(zhǎng)度
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() :獲得客戶(hù)端向服務(wù)器端傳送數(shù)據(jù)的方法
getParameter(String name) :獲得客戶(hù)端傳送給服務(wù)器端的有 name指定的參數(shù)值
getParameterNames() :獲得客戶(hù)端傳送給服務(wù)器端的所有參數(shù)的名字锄列,結(jié)果是一個(gè)枚舉的實(shí)例
getParameterValues(String name):獲得有name指定的參數(shù)的所有值
getProtocol():獲取客戶(hù)端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱(chēng)
getQueryString() :獲得查詢(xún)字符串
getRequestURI() :獲取發(fā)出請(qǐng)求字符串的客戶(hù)端地址
getRemoteAddr():獲取客戶(hù)端的 IP 地址
getRemoteHost() :獲取客戶(hù)端的名字
getSession([Boolean create]) :返回和請(qǐng)求相關(guān) Session
getServerName() :獲取服務(wù)器的名字
getServletPath():獲取客戶(hù)端所請(qǐng)求的腳本文件的路徑
getServerPort():獲取服務(wù)器的端口號(hào)
removeAttribute(String name):刪除請(qǐng)求中的一個(gè)屬性

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

從獲取方式上來(lái)看

request.getParameter()獲取的是從post/get方式得到的參數(shù)
request.getAttribute()獲得的是容器當(dāng)中的參數(shù)

從用途來(lái)看:

getParameter用于客戶(hù)端重定向時(shí)图云,即點(diǎn)擊了鏈接或提交按扭時(shí)傳值用,即用于在用表單或url重定向傳值時(shí)接收數(shù)據(jù)用邻邮。getAttribute用于服務(wù)器端重定向時(shí)竣况,即在 sevlet 中使用了 forward 函數(shù),或 struts 中使用了 mapping.findForward。 getAttribute 只能收到程序用 setAttribute 傳過(guò)來(lái)的值筒严。

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

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

8.JSP三大指令

page指令

實(shí)例:<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8”%>


圖片.png

include指令

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

include動(dòng)作: jsp:include動(dòng)作元素用來(lái)包含靜態(tài)和動(dòng)態(tài)的文件柒傻。該動(dòng)作把指定文件插入正在生成的頁(yè)面。語(yǔ)法格式如下: <jsp:include page="相對(duì) URL 地址" flush="true" />

taglib指令

taglib指令是用來(lái)在當(dāng)前jsp頁(yè)面中導(dǎo)入第三方的標(biāo)簽庫(kù)
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” % prefix=”c” >
prefix:指定標(biāo)簽前綴较木,這個(gè)東西可以隨意起名
uri:指定第三方標(biāo)簽庫(kù)的uri(唯一標(biāo)識(shí))
當(dāng)然红符,需要先把第三方標(biāo)簽庫(kù)所需jar包放到類(lèi)路徑中。

9.JSP七大動(dòng)作

jsp:include:在頁(yè)面被請(qǐng)求的時(shí)候引入一個(gè)文件伐债。
jsp:useBean:尋找或者實(shí)例化一個(gè) JavaBean预侯。
jsp:setProperty:設(shè)置 JavaBean 的屬性。
jsp:getProperty:輸出某個(gè) JavaBean 的屬性泳赋。
jsp:forward:把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面雌桑。
jsp:plugin:根據(jù)瀏覽器類(lèi)型為 Java 插件生成 OBJECT 或 EMBED 標(biāo)記
講解JSP中的四種作用域

10.JSP中的四種作用域包括page、request祖今、session和application校坑,具體來(lái)說(shuō):

page代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。
request代表與Web客戶(hù)機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性千诬。一個(gè)請(qǐng)求可能跨越多個(gè)頁(yè)面耍目,涉及多個(gè)Web組件;需要在頁(yè)面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域徐绑。
session代表與某個(gè)用戶(hù)與服務(wù)器建立的一次會(huì)話(huà)相關(guān)的對(duì)象和屬性邪驮。跟某個(gè)用戶(hù)相關(guān)的數(shù)據(jù)應(yīng)該放在用戶(hù)自己的session中。
application代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性傲茄,它實(shí)質(zhì)上是跨越整個(gè)Web應(yīng)用程序毅访,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話(huà)的一個(gè)全局作用域盘榨。

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

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

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

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

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

1.使用Cookie

向客戶(hù)端發(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)中
從客戶(hù)端讀取Cookie
String name ="name"; 
Cookie[]cookies =request.getCookies(); 
if(cookies !=null){ 
   for(int i= 0;i<cookies.length;i++){ 
    Cookie cookie =cookies[i]; 
    if(name.equals(cookis.getName())) 
    //something is here. 
    //you can get the value 
    cookie.getValue(); 
       
   }
 }

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

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

2.URL 重寫(xiě)

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

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

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

3.隱藏的表單域

<input type="hidden" name ="session" value="..."/>

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

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

5.HttpSession

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

13.Cookie和Session的的區(qū)別

1.由于HTTP協(xié)議是無(wú)狀態(tài)的協(xié)議干奢,所以服務(wù)端需要記錄用戶(hù)的狀態(tài)時(shí)痊焊,就需要用某種機(jī)制來(lái)識(shí)具體的用戶(hù),這個(gè)機(jī)制就是Session.典型的場(chǎng)景比如購(gòu)物車(chē)忿峻,當(dāng)你點(diǎn)擊下單按鈕時(shí)薄啥,由于HTTP協(xié)議無(wú)狀態(tài),所以并不知道是哪個(gè)用戶(hù)操作的逛尚,所以服務(wù)端要為特定的用戶(hù)創(chuàng)建了特定的Session垄惧,用用于標(biāo)識(shí)這個(gè)用戶(hù),并且跟蹤用戶(hù)绰寞,這樣才知道購(gòu)物車(chē)?yán)锩嬗袔妆緯?shū)到逊。這個(gè)Session是保存在服務(wù)端的铣口,有一個(gè)唯一標(biāo)識(shí)。在服務(wù)端保存Session的方法很多觉壶,內(nèi)存脑题、數(shù)據(jù)庫(kù)、文件都有铜靶。集群的時(shí)候也要考慮Session的轉(zhuǎn)移叔遂,在大型的網(wǎng)站,一般會(huì)有專(zhuān)門(mén)的Session服務(wù)器集群争剿,用來(lái)保存用戶(hù)會(huì)話(huà)已艰,這個(gè)時(shí)候 Session 信息都是放在內(nèi)存的,使用一些緩存服務(wù)比如Memcached之類(lèi)的來(lái)放 Session蚕苇。
2.思考一下服務(wù)端如何識(shí)別特定的客戶(hù)哩掺?這個(gè)時(shí)候Cookie就登場(chǎng)了。每次HTTP請(qǐng)求的時(shí)候涩笤,客戶(hù)端都會(huì)發(fā)送相應(yīng)的Cookie信息到服務(wù)端嚼吞。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來(lái)實(shí)現(xiàn)Session跟蹤的,第一次創(chuàng)建Session的時(shí)候蹬碧,服務(wù)端會(huì)在HTTP協(xié)議中告訴客戶(hù)端誊薄,需要在 Cookie 里面記錄一個(gè)Session ID,以后每次請(qǐng)求把這個(gè)會(huì)話(huà)ID發(fā)送到服務(wù)器锰茉,我就知道你是誰(shuí)了呢蔫。有人問(wèn),如果客戶(hù)端的瀏覽器禁用了 Cookie 怎么辦飒筑?一般這種情況下片吊,會(huì)使用一種叫做URL重寫(xiě)的技術(shù)來(lái)進(jìn)行會(huì)話(huà)跟蹤,即每次HTTP交互协屡,URL后面都會(huì)被附加上一個(gè)諸如 sid=xxxxx 這樣的參數(shù)俏脊,服務(wù)端據(jù)此來(lái)識(shí)別用戶(hù)。
3. Cookie其實(shí)還可以用在一些方便用戶(hù)的場(chǎng)景下肤晓,設(shè)想你某次登陸過(guò)一個(gè)網(wǎng)站爷贫,下次登錄的時(shí)候不想再次輸入賬號(hào)了,怎么辦补憾?這個(gè)信息可以寫(xiě)到Cookie里面漫萄,訪(fǎng)問(wèn)網(wǎng)站的時(shí)候,網(wǎng)站頁(yè)面的腳本可以讀取這個(gè)信息盈匾,就自動(dòng)幫你把用戶(hù)名給填了腾务,能夠方便一下用戶(hù)。這也是Cookie名稱(chēng)的由來(lái)削饵,給用戶(hù)的一點(diǎn)甜頭岩瘦。所以未巫,總結(jié)一下:Session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)跟蹤用戶(hù)的狀態(tài)启昧,這個(gè)數(shù)據(jù)可以保存在集群叙凡、數(shù)據(jù)庫(kù)、文件中密末;Cookie是客戶(hù)端保存用戶(hù)信息的一種機(jī)制狭姨,用來(lái)記錄用戶(hù)的一些信息,也是實(shí)現(xiàn)Session的一種方式苏遥。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赡模,隨后出現(xiàn)的幾起案子田炭,更是在濱河造成了極大的恐慌,老刑警劉巖漓柑,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件教硫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辆布,警方通過(guò)查閱死者的電腦和手機(jī)瞬矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锋玲,“玉大人景用,你說(shuō)我怎么就攤上這事〔氧澹” “怎么了伞插?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盾碗。 經(jīng)常有香客問(wèn)我媚污,道長(zhǎng),這世上最難降的妖魔是什么廷雅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任耗美,我火速辦了婚禮,結(jié)果婚禮上航缀,老公的妹妹穿的比我還像新娘商架。我一直安慰自己,他們只是感情好芥玉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布甸私。 她就那樣靜靜地躺著,像睡著了一般飞傀。 火紅的嫁衣襯著肌膚如雪皇型。 梳的紋絲不亂的頭發(fā)上诬烹,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音弃鸦,去河邊找鬼绞吁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唬格,可吹牛的內(nèi)容都是我干的家破。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼购岗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汰聋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起喊积,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烹困,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后乾吻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體髓梅,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年绎签,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枯饿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诡必,死狀恐怖奢方,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爸舒,我是刑警寧澤袱巨,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站碳抄,受9級(jí)特大地震影響愉老,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剖效,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一嫉入、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧璧尸,春花似錦咒林、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春欢瞪,著一層夾襖步出監(jiān)牢的瞬間活烙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工遣鼓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啸盏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓骑祟,卻偏偏與公主長(zhǎng)得像回懦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子次企,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容