最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Security如何在Servlet中執(zhí)行

 更新時(shí)間:2020年04月28日 15:14:32   作者:架構(gòu)文摘  
這篇文章主要介紹了Spring Security如何在Servlet中執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Spring Security 是一個(gè)強(qiáng)大的認(rèn)證和授權(quán)框架,它的使用方式也非常簡(jiǎn)單,但是要想真正理解它就需要花一時(shí)間來(lái)學(xué)習(xí)了,最近在學(xué)習(xí) Spring Security 時(shí)有一些新的理解,特意記錄下來(lái)防止知識(shí)忘記的太快,畢竟好記性不如爛筆關(guān),也給即將準(zhǔn)備學(xué)習(xí) Spring Security 的同志做一個(gè)參考。

由于我在學(xué)習(xí)和使用是基于 Servlet Applications 的,所以文中的大部分都與 Servlet 相關(guān),當(dāng)然 Spring Security 還支持 Reactive Applications 功能上都是一樣,在架構(gòu)上會(huì)有一些差別,有興趣的同學(xué)可以自行查看官方文檔。

Spring Securty 在 Servlet Applications 中的應(yīng)用

以下部分內(nèi)容摘自官方文檔

Servlet Filter Chain

提到 Servlet Filter Chain 應(yīng)該都熟悉的吧,它們是一系列由 javax.servlet.Filter 實(shí)現(xiàn)類組成的一個(gè)鏈,大致圖如下所示:

上圖中Client發(fā)送Http請(qǐng)求,然后請(qǐng)求經(jīng)過(guò)FilterChain,每個(gè)匹配的Filter都有機(jī)會(huì)處理request和response對(duì)象,最終請(qǐng)求會(huì)到達(dá)servlet(如何filter中沒(méi)有特殊處理的情況下)。

Spring Security 的實(shí)現(xiàn)簡(jiǎn)單來(lái)說(shuō),就是往Servlet Filter Chain加了一個(gè)特殊的過(guò)濾器來(lái)處理認(rèn)證或授權(quán)請(qǐng)求 。

DelegatingFilterProxy

Spring 提供一個(gè)javax.servlet.Filter的實(shí)現(xiàn)類 DelegatingFilterProxy ,它的主要功能跟它的名稱一樣,通過(guò)代理模式委托給一個(gè)Spring管理的Bean來(lái)完成相應(yīng)的功能。

在上圖中,DelegatingFilterProxy 會(huì)在 ApplicationContext 中查找 Filter0 并執(zhí)行Filter0的doFilter方法:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
  // Lazily get Filter that was registered as a Spring Bean
  // For the example in DelegatingFilterProxy delegate is an instance of Bean Filter0
  Filter delegate = getFilterBean(someBeanName);
  // delegate work to the Spring Bean
  delegate.doFilter(request, response);
}

FilterChainProxy

前面說(shuō)過(guò)DelegatingFilterProxy只是一個(gè)代理 Filter,并沒(méi)有真正的功能。
在 Spring Security 中還有一個(gè) FilterChainProxy 類,它是 Spring Security 中非常重要的入口(斷點(diǎn)打在這準(zhǔn)沒(méi)錯(cuò)),它負(fù)責(zé)匹配請(qǐng)求、執(zhí)行 Filter 等功能。

你可能發(fā)現(xiàn)了上圖中在FilterChainProxy部分還有個(gè) SecurityFilterChain,它是一個(gè)接口只有兩個(gè)方法:

  • matches用于匹配請(qǐng)求
  • getFilters是獲取針對(duì)匹配請(qǐng)求的所有的 Filters

SecurityFilterChain 接口:

public interface SecurityFilterChain {
  boolean matches(HttpServletRequest request);
  List<Filter> getFilters();
}

SecurityFilterChain

SecurityFilterChain 里面包含很多個(gè) Filter ,不同的 Filter 完成不同的功能,如登陸認(rèn)證、退出登陸、設(shè)置SecurityContext等,在Spring Security 中可以有多個(gè) SecurityFilterChain 每個(gè) SecurityFilterChain 負(fù)責(zé)不同的請(qǐng)求地址,如可以針對(duì)/app/api/**與/web/api/**設(shè)置不同的認(rèn)證規(guī)則。

總結(jié)

前面提到了四個(gè)重要的概念:

  • Servlet Filter Chain:Serverl過(guò)濾器鏈
  • DelegatingFilterProxy:Spring Filter代理類,將功能委托給 FilterChainProxy
  • FilterChainProxy:匹配請(qǐng)求,執(zhí)行 SecurityFilterChain 中的過(guò)濾器
  • SecurityFilterChain:包含一組Filter

總結(jié)下來(lái)可以用一張圖表示:

根據(jù)上面圖如Client訪問(wèn)/web/api/login就會(huì)匹配到SecurityFilterChain 0并執(zhí)行其中的 Filters。

匹配過(guò)程我看了下FilterChainProxy的源碼,大致流程和我理解的差不多,我把代碼精簡(jiǎn)了一下以下:

public class FilterChainProxy extends GenericFilterBean {
	private List<SecurityFilterChain> filterChains;
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
	  ...
    doFilterInternal(request, response, chain);
	  	...
	}
	private void doFilterInternal(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
	  ...
		List<Filter> filters = getFilters(fwRequest);
    ...
		VirtualFilterChain vfc = new VirtualFilterChain(fwRequest, chain, filters);
		vfc.doFilter(fwRequest, fwResponse);
	}
	private List<Filter> getFilters(HttpServletRequest request) {
		for (SecurityFilterChain chain : filterChains) {
			if (chain.matches(request)) {
				return chain.getFilters();
			}
		}

		return null;
	}
 
	private static class VirtualFilterChain implements FilterChain {
	
		@Override
		public void doFilter(ServletRequest request, ServletResponse response)
				throws IOException, ServletException {
		
		...
	}
}

首先在FilterChainProxy的doFilter方法會(huì)執(zhí)行doFilterInternal方法

doFilterInternal 方法中調(diào)用 getFilters 獲取過(guò)濾器列表

	private List<Filter> getFilters(HttpServletRequest request) {
		for (SecurityFilterChain chain : filterChains) {
			if (chain.matches(request)) {
				return chain.getFilters();
			}
		}
		return null;
	}

在 getFilters 會(huì)調(diào)用SecurityFilterChain.matches匹配請(qǐng)求

最后將得到的filters放在 VirtualFilterChain 中執(zhí)行最后

這篇文章主要講述了 Spring Securty 與 Servlet Applications 集成部分

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MybatisPlus字段自動(dòng)填充失效,填充值為null的解決方案

    MybatisPlus字段自動(dòng)填充失效,填充值為null的解決方案

    這篇文章主要介紹了MybatisPlus字段自動(dòng)填充失效,填充值為null的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot集成POI導(dǎo)出Execl表格之統(tǒng)一工具類

    SpringBoot集成POI導(dǎo)出Execl表格之統(tǒng)一工具類

    這篇文章主要為大家詳細(xì)介紹了SpringBoot集成POI導(dǎo)出Execl表格之統(tǒng)一工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 基于Gradle搭建Spring?5.3.13-release源碼閱讀環(huán)境的詳細(xì)流程

    基于Gradle搭建Spring?5.3.13-release源碼閱讀環(huán)境的詳細(xì)流程

    這篇文章主要介紹了基于Gradle搭建Spring?5.3.13-release源碼閱讀環(huán)境,首先安裝jdk、gradle等一系列必要操作,本文通過(guò)實(shí)例代碼相結(jié)合給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的原理及實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的原理及實(shí)現(xiàn)

    紅黑樹(shù)是一種特殊的二叉查找樹(shù),每個(gè)結(jié)點(diǎn)都要儲(chǔ)存位表示結(jié)點(diǎn)的顏色,或紅或黑。本文將通過(guò)示例為大家詳細(xì)講講紅黑樹(shù)的原理及Java實(shí)現(xiàn),感興趣的可以了解一下
    2022-09-09
  • SpringBoot中RabbitMQ集群的搭建詳解

    SpringBoot中RabbitMQ集群的搭建詳解

    單個(gè)的?RabbitMQ?肯定無(wú)法實(shí)現(xiàn)高可用,要想高可用,還得上集群。這篇文章主要介紹了SpringBoot中RabbitMQ集群的兩種模式的搭建:普通集群搭建和鏡像集群搭建,需要的朋友可以參考一下
    2021-12-12
  • SpringBoot2.動(dòng)態(tài)@Value的實(shí)現(xiàn)方式

    SpringBoot2.動(dòng)態(tài)@Value的實(shí)現(xiàn)方式

    這篇文章主要介紹了SpringBoot2.動(dòng)態(tài)@Value的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 淺談Storm在zookeeper上的目錄結(jié)構(gòu)

    淺談Storm在zookeeper上的目錄結(jié)構(gòu)

    這篇文章主要介紹了淺談Storm在zookeeper上的目錄結(jié)構(gòu)的相關(guān)內(nèi)容,涉及storm使用zookeeper的操作以及詳細(xì)結(jié)構(gòu)圖,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊(cè)中心的方法

    SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊(cè)中心的方法

    本文主要介紹了SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊(cè)中心,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java編碼IDEA主題推薦

    java編碼IDEA主題推薦

    在這篇文章中,我精選了幾個(gè)比較是和?Java?編碼的?IDEA?主題供小伙伴們選擇。另外,我自己用的是?One?Dark?theme?這款,有需要的朋友可以借鑒參考下,希望大家喜歡
    2022-01-01
  • SpringBoot實(shí)現(xiàn)WEB的常用功能案例詳解

    SpringBoot實(shí)現(xiàn)WEB的常用功能案例詳解

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)WEB的常用功能,本文將對(duì)Spring Boot實(shí)現(xiàn)Web開(kāi)發(fā)中涉及的三大組件Servlet、Filter、Listener以及文件上傳下載功能以及打包部署進(jìn)行實(shí)現(xiàn),需要的朋友可以參考下
    2022-04-04

最新評(píng)論

广宁县| 海宁市| 泾源县| 青州市| 嘉峪关市| 凤山县| 宾川县| 泉州市| 河源市| 那坡县| 青州市| 佛山市| 靖安县| 闸北区| 太原市| 乌什县| 兴仁县| 沂水县| 沙雅县| 长乐市| 海淀区| 大姚县| 娄底市| 泾源县| 台州市| 德令哈市| 普格县| 平定县| 甘洛县| 新田县| 乌兰浩特市| 屏东市| 桂阳县| 黔东| 青铜峡市| 龙游县| 绥棱县| 石泉县| 建宁县| 汉中市| 墨竹工卡县|