Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 免费jizz在在线播放国产,18成人免费观看视频,精品国产综合成人亚洲区

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          PHP寫(xiě)一段用戶登錄的代碼


          使用PHP編寫(xiě)用戶登錄的代碼時(shí),通常會(huì)涉及HTML表單來(lái)接收用戶名和密碼,然后使用PHP來(lái)處理這些輸入并驗(yàn)證它們。以下是一個(gè)簡(jiǎn)單的PHP用戶登錄示例,其中假設(shè)你已經(jīng)有了一個(gè)存儲(chǔ)用戶信息的MySQL數(shù)據(jù)庫(kù)。

          首先,你需要一個(gè)HTML表單(`login.html`):

          ```

          于Cookie和Session的功能與工作原理,在這里我就不再敘述了,大家想要了解可以看一下我的上一篇博客,講的還是很細(xì)致的。

          但是之前講的Session是運(yùn)行在一臺(tái)服務(wù)器上的,所有的訪問(wèn)都會(huì)到達(dá)我們的唯一服務(wù)器上,這樣我們可以根據(jù)客戶端傳來(lái)的sessionID,來(lái)獲取session,或在對(duì)應(yīng)Session不存在的情況下(session 生命周期到了/用戶第一次登錄),創(chuàng)建一個(gè)新的Session;但是,如果我們?cè)诩涵h(huán)境下,假設(shè)我們有兩臺(tái)服務(wù)器A,B,用戶的請(qǐng)求會(huì)由Nginx服務(wù)器進(jìn)行轉(zhuǎn)發(fā)(別的方案也是同理),用戶登錄時(shí),Nginx將請(qǐng)求轉(zhuǎn)發(fā)至服務(wù)器A上,A創(chuàng)建了新的session,并將SessionID返回給客戶端,用戶在瀏覽其他頁(yè)面時(shí),客戶端驗(yàn)證登錄狀態(tài),Nginx將請(qǐng)求轉(zhuǎn)發(fā)至服務(wù)器B,由于B上并沒(méi)有對(duì)應(yīng)客戶端發(fā)來(lái)sessionId的session,所以會(huì)重新創(chuàng)建一個(gè)新的session,并且再將這個(gè)新的sessionID返回給客戶端,這樣,我們可以想象一下,用戶每一次操作都有1/2的概率進(jìn)行再次的登錄,這樣不僅對(duì)用戶體驗(yàn)特別差,還會(huì)讓服務(wù)器上的session激增,加大服務(wù)器的運(yùn)行壓力。

          為了解決集群環(huán)境下的seesion共享問(wèn)題,共有4種解決方案:

          1.粘性session

          粘性session是指Ngnix每次都將同一用戶的所有請(qǐng)求轉(zhuǎn)發(fā)至同一臺(tái)服務(wù)器上,即將用戶與服務(wù)器綁定。

          2.服務(wù)器session復(fù)制

          即每次session發(fā)生變化時(shí),創(chuàng)建或者修改,就廣播給所有集群中的服務(wù)器,使所有的服務(wù)器上的session相同。

          3.session共享

          緩存session,使用redis, memcached。

          4.session持久化

          將session存儲(chǔ)至數(shù)據(jù)庫(kù)中,像操作數(shù)據(jù)一樣才做session。

          其實(shí),最簡(jiǎn)單的兩種方案,就是方案一和方案三,都不需要對(duì)session進(jìn)行任何操作,只需要將Nginx和Tomcat上的配置文件修改一下即可。由于我們做集群,訪問(wèn)量一定是比較大的了,對(duì)于第一種方案,如果某臺(tái)服務(wù)器發(fā)生故障,此服務(wù)器上的所有用戶的session都會(huì)丟失,所以今天我們采用第三種解決方案。

          感謝開(kāi)源項(xiàng)目tomcat-redis-session-manager,感謝項(xiàng)目的發(fā)起者jcoleman。

          此方案最簡(jiǎn)單之處就在于我們無(wú)需修改項(xiàng)目,只需要修改Tomcat的context.xml配置文件即可,并且,redis服務(wù)器同樣可以做分布式。

          接下來(lái),我們來(lái)講解一下如何配置tomcat,首先,講解一下注意事項(xiàng),因?yàn)轫?xiàng)目的原因,并沒(méi)能用maven來(lái)管理依賴的包,而在我配置的時(shí)候,很正常的發(fā)生了包版本間的沖突,從redis中取出的序列化后的session無(wú)法轉(zhuǎn)換為HttpSession,所以,大家做的時(shí)候一定要注意版本間的兼容問(wèn)題。

          把我使用的版本給大家做個(gè)參考吧,tomcat-redis-session-manager-1.1.jar,jedis-2.1.0.jar,commons-pool-1.6.jar

          這三個(gè)包需放入 tomcat的安裝目錄下的lib文件夾下,IDE自帶的tomcat可以在配置中查看。

          需注意的是,當(dāng)redis的版本‘過(guò)高’時(shí),需要依賴commons-pool2.jar,(具體版本不寫(xiě))。

          接下來(lái),我們就講一下最核心的配置,配置context.xml文件(文件路徑workspace\.metadata\.me_tcat7\conf,此處僅是myeclipse編輯器的路徑)

          [html] view plain copy

          1. <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
          2. <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
          3. host="127.0.0.1"
          4. port="9313"
          5. database="0"
          6. maxInactiveInterval="60"/>

          這個(gè)里的class路徑具體看tomcat-redis-session-manager里的路徑。

          可能你會(huì)遇到重啟tomcat配置文件會(huì)被還原的問(wèn)題,那么你還需要修改另一處的context.xml文件,workspace\Servers\MyEclipse Tomcat v7.0-config文件夾中的,修改內(nèi)容同上。

          接下來(lái),給大家看一下配置完成后的結(jié)果:

          圖1為監(jiān)聽(tīng)到的redis服務(wù)器的狀態(tài),可以看到我們將session序列化后以sessionID為key存入了redis中,圖2可以看到是客戶端header中的cookie信息(若有疑問(wèn)可以查看我上一篇的博客),圖三是我在redis客戶端get key為sessionID的記錄,可以驗(yàn)證成功,我們配置是成功了的,因?yàn)槭褂玫淖约旱碾娔X,配置有限,并沒(méi)有開(kāi)幾個(gè)tomcat來(lái)測(cè)試,不過(guò)上述還是很有說(shuō)服力的(線上已經(jīng)測(cè)試過(guò)了)。

          希望對(duì)你有幫助!

          ookie 和 Session 是 Web 應(yīng)用程序中用于保持用戶狀態(tài)的兩種常見(jiàn)機(jī)制,它們之間既有聯(lián)系也有區(qū)別。

          Cookie 是由服務(wù)器在 HTTP 響應(yīng)中發(fā)送給客戶端(通常是瀏覽器)的一小段數(shù)據(jù)。客戶端將這些信息保存在本地,并在后續(xù)的請(qǐng)求中自動(dòng)將其發(fā)送回服務(wù)器。

          而 Session 是在服務(wù)器端創(chuàng)建的一種機(jī)制,用于跟蹤用戶的會(huì)話狀態(tài)。服務(wù)器會(huì)給每個(gè)用戶分配一個(gè)唯一的會(huì)話 ID,并將該 ID 通過(guò) Cookie 或其他方式傳遞給客戶端。客戶端隨后在請(qǐng)求時(shí)攜帶會(huì)話 ID,服務(wù)器根據(jù)這個(gè) ID 從內(nèi)存或數(shù)據(jù)庫(kù)中檢索與該用戶相關(guān)的會(huì)話數(shù)據(jù)。

          1.Cookie和Session的關(guān)系

          嚴(yán)格意義上來(lái)說(shuō),Cookie 和 Session 是沒(méi)有任何關(guān)系的,但 Session 的實(shí)現(xiàn)中借助了 Cookie 機(jī)制

          通過(guò)以下 Session 執(zhí)行的機(jī)制,我們就能知道 Session 是如何借助 Cookie 完成自己的執(zhí)行流程的:

          1. 會(huì)話創(chuàng)建:通常情況下,當(dāng)用戶登錄成功后,服務(wù)器會(huì)為該用戶創(chuàng)建一個(gè)新的會(huì)話。在創(chuàng)建會(huì)話過(guò)程中,服務(wù)器會(huì)為該會(huì)話生成一個(gè)唯一的標(biāo)識(shí)符,通常稱為 Session ID。
          2. Session ID 傳遞:服務(wù)器將生成的 Session ID 通過(guò)響應(yīng)的方式發(fā)送給客戶端,使用 SetCookie 命令,將用戶的 Session ID 保存在 Cookie 中,通常是一個(gè)名為 JSESSIONID 的 Cookie。
          3. Session 數(shù)據(jù)存儲(chǔ):在服務(wù)器端,Session 數(shù)據(jù)會(huì)被存儲(chǔ)在一個(gè)能夠關(guān)聯(lián) Session ID 的數(shù)據(jù)結(jié)構(gòu)中(例如內(nèi)存、數(shù)據(jù)庫(kù)或者文件存儲(chǔ)等)。常用的方式是將 Session ID 作為鍵,與對(duì)應(yīng)的 Session 用戶身份數(shù)據(jù)進(jìn)行關(guān)聯(lián)。
          4. Session ID 驗(yàn)證與檢索:當(dāng)用戶發(fā)送一個(gè)新的請(qǐng)求時(shí),客戶端會(huì)將之前存儲(chǔ)的 Session ID 攜帶在請(qǐng)求的 Cookie 或請(qǐng)求頭中發(fā)送給服務(wù)器。服務(wù)器會(huì)根據(jù) Session ID 找到對(duì)應(yīng)的 Session 數(shù)據(jù),從而獲得用戶的狀態(tài)信息。
          5. Session 數(shù)據(jù)使用:服務(wù)器在獲取到 Session 數(shù)據(jù)后,可以根據(jù)具體需求讀取、修改或刪除其中保存的狀態(tài)信息。服務(wù)器可以通過(guò) Session 來(lái)管理用戶的登錄狀態(tài)、購(gòu)物車內(nèi)容、用戶配置等。
          6. Session 過(guò)期與銷毀:Session 有一個(gè)有效期限,一般通過(guò)設(shè)置一個(gè)固定的時(shí)間,或者在一定時(shí)間內(nèi)沒(méi)有用戶活動(dòng)時(shí)會(huì)將 Session 標(biāo)記為過(guò)期。當(dāng) Session 過(guò)期時(shí),服務(wù)器會(huì)銷毀對(duì)應(yīng)的 Session 數(shù)據(jù),釋放內(nèi)存或其他資源。

          所以默認(rèn)情況下,Session 是借助 Cookie 來(lái)完成身份標(biāo)識(shí)的傳遞的,這樣服務(wù)器端才能根據(jù) Session ID 和保存的會(huì)話信息進(jìn)行關(guān)聯(lián),用于找到某個(gè)具體登錄的用戶,所以說(shuō):默認(rèn)情況下,Session 機(jī)制是依賴 Cookie 實(shí)現(xiàn)的

          2.禁用Cookie后Session還能用嗎?

          那么問(wèn)題來(lái)了,禁用 Cookie 后 Session 還能用嗎?

          答案是:默認(rèn)情況下禁用 Cookie 后,Session 是無(wú)法正常使用的

          這是因?yàn)榇蠖鄶?shù) Web 服務(wù)器都是依賴于 Cookie 來(lái)傳遞 Session 的會(huì)話 ID 的。客戶端瀏覽器禁用 Cookie 時(shí),服務(wù)器將無(wú)法把會(huì)話 ID 發(fā)送給客戶端,客戶端也無(wú)法在后續(xù)請(qǐng)求中攜帶會(huì)話 ID 返回給服務(wù)器,從而導(dǎo)致服務(wù)器無(wú)法識(shí)別用戶會(huì)話。

          但是,默認(rèn)情況下禁用 Cookie 后,Session 就不能用了,但可以通過(guò)一些手段來(lái)解決這個(gè)問(wèn)題。

          3.解決方案

          以下的兩種解決方案可以繞過(guò) Cookie 繼續(xù)運(yùn)行 Session:

          1. URL 中攜帶 SessionID:可以通過(guò) URL 重寫(xiě)的方式將 Session ID 添加到所有的 URL 中。服務(wù)器生成 Session ID 后,將其作為 URL 的一部分傳遞給客戶端,客戶端在后續(xù)的請(qǐng)求中將 Session ID 帶在 URL 中。服務(wù)器端需要相應(yīng)地解析 URL 來(lái)獲取 Session ID,并維護(hù)用戶的會(huì)話狀態(tài)。
          2. 隱藏表單字段傳遞 SessionID:將 Session ID 添加到 HTML 表單的隱藏字段中。在每個(gè)表單中添加一個(gè)隱藏的字段,保存 Session ID,客戶端提交表單時(shí)會(huì)將 Session ID 隨表單數(shù)據(jù)一起發(fā)送到服務(wù)器,服務(wù)器通過(guò)解析表單數(shù)據(jù)中的 Session ID 來(lái)獲取用戶的會(huì)話狀態(tài)。

          這些方法雖然可以在禁用 Cookie 的情況下繼續(xù)使用 Session,但需要在服務(wù)器端進(jìn)行相應(yīng)的代碼修改和配置。但同時(shí)這些手段也帶來(lái)了以下幾個(gè)新問(wèn)題:

          1. 增加了編碼復(fù)雜度:需要改前端和后端代碼才能繼續(xù)使用 Session 機(jī)制,增加了編碼復(fù)雜度。
          2. 增加了安全風(fēng)險(xiǎn):這些替代方法可能會(huì)增加一些安全風(fēng)險(xiǎn),因?yàn)?Session ID 將以明文形式出現(xiàn)在 URL 或表單中,很容易被第三方劫持和獲取。

          小結(jié)

          Session 實(shí)現(xiàn)是依賴 Cookie 來(lái)存儲(chǔ)會(huì)話 ID 的,所以默認(rèn)情況下,如果禁用了 Cookie,Session 就不能使用了。但是我們可以通過(guò)特殊的手段,例如在 URL 中傳遞 SessionID 或表單中使用隱藏字段傳遞 SessionID 的方式,配合服務(wù)器端代碼的修改,是 Session 機(jī)制繼續(xù)使用,但這樣使用增加了編碼的復(fù)雜度,和帶來(lái)了一定的安全風(fēng)險(xiǎn)。

          本文已收錄到我的面試小站 [www.javacn.site](https://www.javacn.site),其中包含的內(nèi)容有:Redis、JVM、并發(fā)、并發(fā)、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設(shè)計(jì)模式、消息隊(duì)列等模塊。


          主站蜘蛛池模板: 人妻夜夜爽天天爽爽一区| 好吊妞视频一区二区| 无码人妻精一区二区三区| 国产激情无码一区二区三区| 少妇无码一区二区三区| 国模大尺度视频一区二区| 一区二区三区四区在线观看视频| 中文乱码人妻系列一区二区| 一区二区三区在线|欧| 久久精品一区二区| 夜夜嗨AV一区二区三区| 亚洲国产精品第一区二区三区| 卡通动漫中文字幕第一区| 狠狠综合久久av一区二区| 无码人妻啪啪一区二区| 精品香蕉一区二区三区| 91video国产一区| 亚洲第一区二区快射影院| 精品一区二区三区免费毛片爱| 日韩精品中文字幕无码一区| 亚洲一区影音先锋色资源| 亚洲AV午夜福利精品一区二区| 久久精品一区二区三区四区| 亚洲国产精品一区二区久久hs | 国产一区二区三区福利| 国产精品久久久久久一区二区三区 | 国产成人精品久久一区二区三区av| 秋霞鲁丝片一区二区三区| 精品女同一区二区| 国产一区二区三区免费视频| 青娱乐国产官网极品一区| 国产情侣一区二区三区| 久久国产免费一区二区三区| 激情内射亚洲一区二区三区| 亚洲Av无码一区二区二三区| 亚洲国产欧美国产综合一区| 国产一区二区三区在线免费| 国产午夜精品一区二区三区嫩草| 无码人妻一区二区三区在线| 亚洲AV无码一区二区三区久久精品| 国产成人精品一区二三区熟女|