關於python網站攔截器介紹的信息

本文目錄一覽:

python getattribute、get、getattr、getitem等用法

__getattribute__

__getattribute__是屬性訪問攔截器,就是當類的屬性被訪問時,會自動調用類的__getattribute__方法。

參考代碼:

代碼執行過程中,當調用實例對象attribute的name屬性時,不會直接列印,而是把name的值作為實參傳進__getattribute__方法中,經過一系列操作後,再把name的值返回。

python中只要定義了繼承object的類,就默認存在屬性攔截器,只不過是攔截後沒有進行任何操作,而是直接返回。

我們可以自己改寫__getattribute__方法來實現相關功能,比如查看許可權、列印log日誌等。

getattr、hasattr、setattr

對象屬性的判斷。

參考代碼:

__getattr__、__setattr__、__delattr__

類支持 . 操作來訪問屬性;定製功能:耗時、日誌等等。

參考代碼:

__getitem__、__setitem__、__delitem__

類支持通過[]來訪問屬性

參考代碼:

__get__、__set__、__delete__

參考代碼:

參考文檔:

一個網站的許可權管理,用過濾器還是攔截器更好

Struts2項目通過使用Struts的if標籤進行了session判斷,使得未登錄的用戶不能看到頁面,但是這 種現僅僅在view層進行,如果未登錄用戶直接在地址欄輸入登錄用戶才能訪問的地址,那麼相應的action還是會執行,僅僅是不讓用戶看到罷了。這樣顯然是不好的,所以研究了一下Struts2的許可權驗證。

許可權最核心的是業務邏輯,具體用什麼技術來實現就簡單得多。

通常:用戶與角色建立多對多關係,角色與業務模塊構成多對多關係,許可權管理在後者關係中。

對許可權的攔截,如果系統請求量大,可以用Struts2攔截器來做,請求量小可以放在filter中。但一般單級攔截還不夠,要做到更細粒度的許可權控制,還需要多級攔截。

不大理解filter(過濾器)和interceptor(攔截器)的區別,遂google之。博文中有介紹:

1、攔截器是基於java的反射機制的,而過濾器是基於函數回調 。

2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器 。

3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求 起作用 。

4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能 。

5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容 器初始化時被調用一次 。

filter過濾器 和攔截器的區別

1、首先要明確什麼是攔截器、什麼是過濾器

1.1 什麼是攔截器:

攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。

在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。

談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。

1.2. 攔截器的實現原理:

大部分時候,攔截器方法都是通過代理的方式來調用的。Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,然後串成一個列表(list),最後一個一個地調用列表中的攔截器。

1.3 什麼是過濾器

過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。在這之後,過濾器可以作如下的選擇:

①以常規的方式調用資源(即,調用servlet或JSP頁面)。

②利用修改過的請求信息調用資源。

③調用資源,但在發送響應到客戶機前對其進行修改。

④阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。

1.4 Servlet過濾器的基本原理

在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交「修改的註冊信息」的網頁,當用戶填寫完修改信息並提交後,伺服器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功後,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。

2、攔截器與過濾器的區別 :

1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。

2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。

3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。

4. 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。

5. 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次

攔截器的代碼實現(以struts2為例):

1、在xml文件中如何定義攔截器

interceptors

interceptor name=”filterIPInterceptor”

class=”com.xxxx.web.FilterIPActionInterceptor” /

interceptor-stack name=”filterIPStack”

interceptor-ref name=”defaultStack” /

interceptor-ref name=”filterIPInterceptor” /

/interceptor-stack

/interceptors

2、怎麼遍別寫自定義攔截器

public class FilterIPActionInterceptor extends AbstractInterceptor

{

/** 日誌控制. */

private final Log log = LogFactory.getLog(getClass());

/**

* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)

*/

@Override

@SuppressWarnings(“unchecked”)

public String intercept(ActionInvocation invocation) throws Exception

{

String result = null;

// 獲得當前方法名.

String methodName = invocation.getInvocationContext().getName();

String currIp = null;

try

{

if (invocation.getAction() instanceof PortletAction)

{

PortletAction action = (PortletAction) invocation.getAction();

currIp = action.getRequest().getRemoteAddr();

}

String ip = ApplicationResource.getHotValue(“ALLOW_CACHE_IP”);

if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp))

{

log.error(“允許刷新的IP不存在或當前請求的IP非法.”);

throw new NoAllowIPException();

}

else

{

String[] ips = ip.split(“,”);

boolean errorIp = true;

for (String s : ips)

{

if (s.equals(currIp))

errorIp = false;

}

// 判斷IP

if (errorIp)

throw new NoAllowIPException();

}

result = invocation.invoke();//調用被攔截的方法

}

catch (Exception e)

{

log.error(“異常類名:” + invocation.getAction().getClass());

log.error(“異常方法:” + methodName, e);

throw e;

}

return result;

}

}

3、怎麼編寫過濾器

1、在web.xml裡面配置自定義的攔截器

filter

filter-nameRedirect Filter/filter-name

filter-classcom.xx.filter.RedirectFilter/filter-class

/filter

filter-mapping

filter-nameRedirect Filter/filter-name

url-pattern/xx/xx/*/url-pattern

/filter-mapping

2、如何編寫自定義的攔截器

public class RedirectFilter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain filterChain) throws IOException, ServletException {

// 獲取URL

Long startTime = null;

if (log.isDebugEnabled())

{

startTime = System.currentTimeMillis();

}

HttpServletRequest httpRequest = (HttpServletRequest) request;

String url = httpRequest.getRequestURL().toString();

if (url == null || url.trim().length() == 0) {

return;

}

if (url.indexOf(luceneCreateMapping) != -1

|| url.indexOf(luceneSearchMapping) != -1) {

doFilterForxxx(request, response, url);

} else {

doxxxx(request, response, url);

}

if (log.isDebugEnabled())

{

long endTime = System.currentTimeMillis();

Thread currentThread = Thread.currentThread();

String threadName = currentThread.getName();

log.debug(“[” + threadName + “]” + ” “

+ this.getClass().getName() + ” ” + url + ” “

+ (endTime – startTime) + ” ms”);

}

// 激活下一個Filter

filterChain.doFilter(request, response);

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248511.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:27
下一篇 2024-12-12 13:27

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論