shiro過濾器詳解

2021-10-17 18:44:55 字數 2671 閱讀 3985

常用的過濾器為authenticatingfilter,具體看一看它是怎麼實現的。

先說一下servlet的過濾器鏈的規則:

servlet中過濾器filter只有三個方法,當我們自定義過濾器的時候需要實現:

主要就是dofilter方法,他的實現方式是這樣子的:

public void dofilter(servletrequest request, servletresponse response,filterchain filterchain) throws ioexception, servletexception
filterchain.dofilter(request, response); 如果這個過濾器鏈中還有過濾器的話,繼續執行下乙個過濾器,沒有的話,就直接放行,執行請求。

再回過頭看一下我們的shiro過濾器實現:

abstractfilter僅僅實現了filter介面,沒幹什麼事。

它下面的nameablefilter也沒乾啥事,就是給filter起了個名字

繼續往下走:onceperrequestfilter保證每個request請求僅經過過濾器一次

每次經過乙個過濾器,先設定attribute,表示該過濾器已經走過了,然後繼續執行過濾器的操作,他把過濾器應該執行的操作封裝到dofilterinternal()方法中了。

這裡的dofilterinternal()方法僅僅是乙個抽象方法,還沒有實現。

advicefilter支援spring的aop風格,它提供了三個方法prehandle(),posthandle(),aftercompletion()類似於spring中的aop。這個過濾器也實現了dofilterinternal()方法

先看一下executechain()方法,這個方法體內是這樣的

過濾器鏈繼續往下執行。那麼executechain()方法之前的prehandle()方法就是過濾器方法必須執行的方法,如果該方法返回false,過濾器鏈就不會繼續往下執行。如果過濾器放行請求的話,這個prehandle()必須要返回true。aftercompletion()方法在cleanup()中。接下來看pathmatchingfilter,它的作用主要是匹配當前請求的路徑和專案中的路徑是否能夠匹配,如果能夠匹配上,就直接返回isfilterchaincontinued()方法,那麼isfilterchaincontinued()的返回結果,便決定了過濾器是否放行請求。

進入isfilterchaincontinued()

從這個日誌可以看出,如果請求的路徑存在配置中,就執行onprehandle()方法,從上面可以分析出,如果路徑匹配成功,並且onprehandle()方法返回為true,過濾器放行。

繼續分析accesscontrolfilter,路徑沒問題的話,主要看onprehandle()的返回值即可,onprehandle()返回為true,過濾器就放行。

可以看出,只要兩個方法有乙個返回為true,過濾器就會放行。這兩個方法在這裡都是抽象方法,並未實現。我們繼續看這個類的繼承類authenticationfilter。

這裡實現了isaccessallowed()方法

如果,使用者已經登入了,返回true;否則就返回false,進入onaccessdenied()方法。它這裡也沒有實現onaccessdenied()方法。

再看authenticatingfilter,這個類也是乙個抽象類onaccessdenied()方法,並未實現,這裡面重寫了isaccessallowed()方法,不過呼叫了父類的isaccessallowed(),也就是上面一張圖的方法。

如果要實現自己的業務的話,就直接繼承authenticatingfilter就可以了,根據自己的業務邏輯要不要放行,實現一下onaccessdenied()方法就好了。

總結一下自定義過濾器的執行步驟,可以直接繼承authenticatingfilter,實現onaccessdenied()方法。如果isaccessallowed()和onaccessdenied(),兩者有乙個返回為true,那麼過濾器就可以放行(路徑正確的話)。

最後,總結的地方如果有什麼疏漏之處,歡迎指正。

1 1 shiro 過濾器詳解

anon 例子 admins anon 沒有引數,表示可以匿名使用。authc 例如 admins user authc表示需要認證 登入 才能使用,沒有引數 roles 例子 admins user roles admin 引數可以寫多個,多個時必須加上引號,並且引數之間用逗號分割,當有多個引數時...

shiro內建過濾器

rest 例子 admins user rest user 根據請求的方法,相當於 admins user perms user method 其中method為post,get,delete等。port 例子 admins user port 8081 當請求的url的埠不是8081是跳轉到sch...

shiro過濾器名稱

功 能配 置 anon 任何使用者傳送的請求都能夠訪問 authc 經過認證的請求可訪問,否則將會將請求重定向到 ini 配置檔案配置的 authc.loginurl 資源,進行認證操作 authc.loginurl login.jsp authc.successurl 認證成功後重定向到此資源 a...