真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringSecurity原理解析之如何理解令牌還原與Session

本篇內(nèi)容主要講解“SpringSecurity原理解析之如何理解令牌還原與Session”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“SpringSecurity原理解析之如何理解令牌還原與Session”吧!

渭城網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

SpringSecurity 原理解析【4】:令牌還原與Session

Session:一般稱為會(huì)話,不同環(huán)境中含義不同,在Spring Security中一個(gè)會(huì)話指:客戶端從令牌認(rèn)證請(qǐng)求到登出注銷請(qǐng)求之間的過(guò)程。Web應(yīng)用基本都是基于HTTP協(xié)議,而該協(xié)議是一個(gè)無(wú)狀態(tài)協(xié)議,兩個(gè)HTTP請(qǐng)求相互獨(dú)立,無(wú)法識(shí)別對(duì)方,在Web應(yīng)用特別是Spring Security等安全框架中,同一個(gè)客戶端發(fā)出的多個(gè)請(qǐng)求,如果不能識(shí)別出,每個(gè)請(qǐng)求都需要認(rèn)證過(guò)程,這對(duì)于每次請(qǐng)求都需要主動(dòng)提供身份識(shí)別信息的客戶端而言絕對(duì)是一個(gè)災(zāi)難。因此需要一個(gè)方案來(lái)解決這個(gè)問(wèn)題:解決方案整體而言只有一個(gè):就給相關(guān)的HTTP請(qǐng)求添加一個(gè)全局總線,將這些HTTP請(qǐng)求打上統(tǒng)一標(biāo)志來(lái)說(shuō)明這些請(qǐng)求都是來(lái)自同一個(gè)身份。而實(shí)現(xiàn)目前主流兩種:Session 和 WebToken,前者為主流標(biāo)準(zhǔn)Web應(yīng)用總線方案實(shí)現(xiàn),標(biāo)志打在Cookie或者URL上,后者為主流前后端分離Web應(yīng)用總線方案實(shí)現(xiàn),標(biāo)志打在請(qǐng)求頭上。

今天主要說(shuō)明前者Session。在JavaEE中Session特指HttpSession,其規(guī)范是在服務(wù)器端定義且實(shí)現(xiàn)的:默認(rèn)每個(gè)請(qǐng)求都會(huì)具有一個(gè)Session實(shí)例

public interface HttpSession {
	
	// 創(chuàng)建時(shí)間
    long getCreationTime();
	
	boolean isNew();

	// 唯一ID
    String getId();

	// 最近一次訪問(wèn)時(shí)間
    long getLastAccessedTime();

	//Servlet上下文
    ServletContext getServletContext();

	// 具有失效能力
	void invalidate();
	
    void setMaxInactiveInterval(int var1);

    int getMaxInactiveInterval();

	// 具有存儲(chǔ)能力	
    Object getAttribute(String var1);

    Enumeration getAttributeNames();

    void setAttribute(String var1, Object var2);

    void removeAttribute(String var1);

}

此時(shí)可以這么理解Session:是一個(gè)具有唯一標(biāo)識(shí)且可控生命周期的存儲(chǔ)結(jié)構(gòu),底層一般為:ConcurrentMap

Session追蹤

會(huì)話追蹤: SessionTracking,意思是追蹤Session來(lái)源,也就是從哪里開(kāi)始查找總線標(biāo)記,默認(rèn)為Cookie和URL,@since Servlet 3.0可配置

public enum SessionTrackingMode {
    COOKIE, URL, SSL
}

Cookie就是將sessionId寫入Cookie,URL則是在重定向時(shí)將sessionId寫入U(xiǎn)RL。而解析Cookie或者URL是在HttpServer內(nèi)部完成的,例如:tomcat、undertow。所以一般看不到Session構(gòu)建的細(xì)節(jié)(不同服務(wù)器實(shí)現(xiàn)不一樣),例如Tomcat服務(wù)器在構(gòu)建Request時(shí)在CoyoteAdapter#postParseRequest,解析SessionId順序?yàn)閁RL --> Cookie --> SSL ,且Cookie優(yōu)先級(jí)最高,URL次之。

雖然不用知道如何解析Session,但是JavaEE給出構(gòu)建入口和構(gòu)建要求:HttpServletRequest#getSession,默認(rèn)情況下session的構(gòu)建交給HttpServer完成,但對(duì)于分布式應(yīng)用,可以由Spring Session模塊接手Session的生命周期。

注意如果會(huì)話追蹤ID丟失,則會(huì)導(dǎo)致Session==null,后續(xù)所有依賴了Session存儲(chǔ)的功能就會(huì)失?。豪纾篊srfFilter

// 主動(dòng)確定返回的Session是否需要重新構(gòu)建
HttpSession getSession(boolean var1);

// 獲取當(dāng)前請(qǐng)求的Session實(shí)例,如果不存在則構(gòu)建
HttpSession getSession();

// 修改SessionId
String changeSessionId();

// Session有效性:是否存活
boolean isRequestedSessionIdValid();
// Session構(gòu)建來(lái)源:是否從Cookie中解析
boolean isRequestedSessionIdFromCookie();
// Session構(gòu)建來(lái)源:是否從URL中解析
boolean isRequestedSessionIdFromURL();

在Spring Security中在服務(wù)端完善令牌之后,可以從上篇文章圖示中看到:令牌完整之后進(jìn)行了Session、Context和Cookie管理.

Session的處理是通過(guò)SessionAuthenticationStrategy來(lái)執(zhí)行的。默認(rèn)是組合(Composite)策略,內(nèi)置:ChangeSessionIdAuthenticationStrategy,復(fù)用現(xiàn)有Session,修改其唯一標(biāo)識(shí)。

CsrfAuthenticationStrategy (org.springframework.security.web.csrf)
ConcurrentSessionControlAuthenticationStrategy (org.springframework.security.web.authentication.session)
RegisterSessionAuthenticationStrategy (org.springframework.security.web.authentication.session)
CompositeSessionAuthenticationStrategy (org.springframework.security.web.authentication.session)
NullAuthenticatedSessionStrategy (org.springframework.security.web.authentication.session)
AbstractSessionFixationProtectionStrategy (org.springframework.security.web.authentication.session)
    ChangeSessionIdAuthenticationStrategy (org.springframework.security.web.authentication.session)
    SessionFixationProtectionStrategy (org.springframework.security.web.authentication.session)

在Session做了案底之后就可以在后續(xù)請(qǐng)求中獲取到并還原了

令牌還原

在Spring Security中有一個(gè)優(yōu)先級(jí)很高的過(guò)濾器:SecurityContextPersistenceFilter:上下文持久化過(guò)濾器,還記得在FilterSecurityInterceptor中獲取服務(wù)端完整令牌就是從SecurityContext中獲取的嗎?

SecurityContext contextBeforeChainExecution = securityContextRepository.loadContext(holder);

這里有個(gè)SecurityContextRepository,安全上下文存儲(chǔ)庫(kù),默認(rèn)是HttpSessionSecurityContextRepository,也就是從HttpSession中獲取到的上下文。而HttpSession則在會(huì)話追蹤中已經(jīng)還原了。

// -------------------------------- session 存儲(chǔ) ------------------------------
// 先獲取到請(qǐng)求中的Session
HttpSession httpSession = request.getSession(false);
// 從Session中獲取SecurityContext
SecurityContext context = readSecurityContextFromSession(httpSession);



// context 就是從ConcurrentMap中 key="SPRING_SECURITY_CONTEXT"獲取
Object contextFromSession = httpSession.getAttribute(springSecurityContextKey);

// -------------------------------- context 存儲(chǔ) ------------------------------
SecurityContextHolder.setContext(context);

到這里,Session的整體流程就清晰明了了,整體圖示如下:

SpringSecurity原理解析之如何理解令牌還原與Session

Session配置

Session細(xì)節(jié)交給了服務(wù)器去設(shè)置,但是Session的配置接口是規(guī)范好的:

public interface SessionCookieConfig {
	
	// 名稱配置:常見(jiàn)為:JSESSIONID
    void setName(String var1);

    String getName();

	// 設(shè)置能攜帶Cookie的請(qǐng)求域名
	// 后綴匹配,設(shè)置格式:點(diǎn)+域名
    void setDomain(String var1);

    String getDomain();

    // 設(shè)置能攜帶Cookie的請(qǐng)求路徑
    // 前綴匹配:緊鄰域名之后的部分URL,默認(rèn):/
    void setPath(String var1);

    String getPath();

    // 設(shè)置額外備注 
    void setComment(String var1);

    String getComment();
	
	// 是否允許客戶端操作Cookie
    void setHttpOnly(boolean var1);

    boolean isHttpOnly();

    // 設(shè)置能攜帶Cookie的請(qǐng)求方式:
	// ture: https,false: http、https
    void setSecure(boolean var1);

    boolean isSecure();
	
	// 有效期配置,默認(rèn)-1,常見(jiàn):3600
    void setMaxAge(int var1);

    int getMaxAge();
}

Spring對(duì)Server的Session有對(duì)應(yīng)的配置類,在容器啟動(dòng)是會(huì)配置到Servlet中。示例:

server.servlet.context-path= /ctx
server.servlet.session.cookie.name= Authorization
server.servlet.session.cookie.path= /ctx/cookie/
server.servlet.session.cookie.max-age=3600
server.servlet.session.cookie.http-only=true
server.servlet.session.cookie.secure=false
server.servlet.session.cookie.comment=new cookie name

瀏覽器:

Set-Cookie: Authorization=_xkjjuKHOrOLbS3KRlUmOrRYYn-Z9oa-cLCLWS54; Version=1; Path=/ctx/cookie/; HttpOnly; Max-Age=3600; Expires=Mon, 26-Oct-2020 02:25:57 GMT; Comment="new cookie name"

后續(xù)攜帶Cookie

Cookie: Authorization=dhiWDzOksYItVwcqIZAew0YQqtA8BI9DZIVUXWjK

注意:Cookie的path默認(rèn)為:"/",意味著任何頁(yè)面如果攜帶Cookie,將是同一個(gè)。如果配置為其他值,一定要保證Spring Security的認(rèn)證路徑能匹配到來(lái)傳輸Cookie。配置格式應(yīng)該為:"contextPath/匹配值路徑/",表示匹配路徑及其子路徑都會(huì)攜帶匹配路徑請(qǐng)求是產(chǎn)生的Cookie。

到此,相信大家對(duì)“SpringSecurity原理解析之如何理解令牌還原與Session”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


網(wǎng)頁(yè)名稱:SpringSecurity原理解析之如何理解令牌還原與Session
當(dāng)前鏈接:http://weahome.cn/article/gisesj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部