導航:首頁 > 凈水問答 > springaop過濾器

springaop過濾器

發布時間:2022-12-07 23:21:12

1. spring過濾器和攔截器的區別

(1)過濾器:

依賴於servlet容器,是JavaEE標准,是在請求進入容器之後,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行後期處理。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的數據,比如:在過濾器中修改字元編碼;在過濾器中修改HttpServletRequest的一些參數,包括:過濾低俗文字、危險字元等

關於過濾器的一些用法可以參考我寫過的這些文章:

2. Spring filter和攔截器的區別和執行順序

Filter的執行順序跟你配置的執行順序是一樣的,執行的話要觸發到才會執行啊
當然要是過濾/*就跟配置順序一樣了

3. SpringBoot 三種攔截http請求方式Filter,interceptor和aop

SpringBoot 三種攔截http請求方式Filter,interceptor和aop。

這三種攔截方式的攔截順序是:filter—>Interceptor-->ControllerAdvice-->@Aspect -->Controller;

這三種方式的區別:
1.過濾器Filter可以拿到原始的HTTP請求和響應的信息, 但是拿不到你真正處理請求方法的信息,也就是方法的信息。
2.攔截器Interceptor可以拿到原始的HTTP請求和響應的信息,也可以拿到你真正處理請求方法的信息,但是拿不到傳進參數的那個值。
3.切片Aspect,既然Spring那麼支持AOP,可以拿到原始的HTTP請求和響應的信息, 也可以拿到你真正處理請求方法的信息,也可以傳進參數的那個值。

實現Filter介面

實現 HandlerInterceptor 介面,然後配置進Spring。

配置進spring

pom.xml 添加Aop支持

4. Spring Cloud Security[微服務安全](一)初識Spring Cloud Security和OAuth2.0

在介紹Spring Cloud Security之前,我們先要介紹一下Spring Security。

Spring Security是一套提供了完整的聲明式安全訪問控制的解決方案。
Spring Security是基於Spring AOP和Servlet過濾器的,它只能服務基於Spring的應用程序。
除常規認證和授權外,它還提供 ACL,LDAP,JAAS,CAS 等高級安全特性以滿足復雜環境中的安全需求。

(注:在Spring Security中,Authority和Permission是兩個完全獨立的概念,兩者沒有必然的聯系。它們之前需要通過配置進行關聯。)

安全方案的實現通常分為 認證(Authentication) 授權(Authorization) 兩部分。

使用者可以使一個 用戶 設備 ,和可以在應用程序中執行某種操作的 其它系統

認證一般通過用戶名和密碼的正確性校驗來完成通過或拒絕。

Spring Security支持的主流認證如下:

Spring Security進行認證的步驟:
++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ 1. 用戶使用用戶名和密碼登陸
++
++ 2. 過濾器()獲取到用戶名
++    和密碼,將它們封裝成Authentication
++
++ 3. AuthenticationManager認證Token(由Authentication實現類傳遞)
++
++ 4. AuthenticationManager認證成功,返回一個封裝了用戶許可權信息
++    的Authentication對象,包含用戶的上下文信息(角色列表)
++
++ 5. 將Authentication對象賦值給當前的SecurityContext,建立這個用戶
++ 的安全上下文( SecurityContextHolder.getContext.setAuthentication() )
++
++ 6. 當用戶進行一些受到訪問控制機制保護的操作,訪問控制機制會依據
++    當前安全的上下文信息來檢查這個操作所需的許可權
++++++++++++++++++++++++++++++++++++++++++++++++++++++

Spring Security提供了一系列基本組件,如spring-security-acl, spring-security-cas, spring-security-oauth2等。
具體這里就不詳述了,讀者可以查看官網的介紹。

 

Spring Cloud Security是用於構建微服務系統架構下的安全的應用程序和服務,它可以輕松實現基於微服務架構的統一的安全認證與授權。

Spring Cloud Security相對於Spring Security整合了Zuul,Feign,而且更加完美地整合了OAuth2.0。

 

OAuth 2.0是用於授權的行業標准協議。

原理:
OAuth2是用戶資源和第三方應用之間的一個中間層。
它把資源和第三方應用隔開,使得第三方應用無法直接訪問資源,第三方應用要訪問資源需要通過提供 憑證(Token) 來獲得OAuth 2.0授權。

OAuth2的典型例子:

==============================================
== 微信公眾號授權提醒
== 頁面彈出一個提示框需要獲取我們的個人信息
== 單擊確定
== 第三方應用會獲取我們在微信公眾平台中的個人信息
==============================================

OAuth的關鍵角色:

在用戶授權第三方獲取私有資源後,第三方通過獲取到的token等信息通過授權伺服器認證,然後去資源伺服器獲取資源。

 

密碼模式中,資源擁有者負責向客戶端提供用戶名和密碼;
客戶端根據用戶名和密碼箱認證伺服器申請令牌,正確後認證伺服器發放令牌。

客戶端請求參數:

缺點:
用戶對客戶端高度可信,必須把自己的密碼發給客戶端,存在被黑客竊取的隱患(不推薦)。

在授權碼模式中,客戶端是通過其後台伺服器與認證伺服器進行交互的。

授權碼模式的運行流程:

從以上圖中我們可以看到客戶端伺服器和認證伺服器需經過2次握手,客戶端伺服器才能拿到最終的訪問和更新令牌。

客戶端申請認證的參數:

 

伺服器返回的參數:

 

客戶端收到授權碼以後,附上重定向URI,向認證伺服器申請訪問令牌。

客戶端申請令牌的參數:

 

伺服器返回的參數:

 

如果訪問令牌已經過期,可以使用更新令牌申請一個新的訪問令牌。

通過更新令牌申請訪問令牌的參數:

這兩種模式不常用,因此在這里就不多敘述了。

5. 如何理解spring中的切面和過濾

切面這個我的理解就是:以前開發都是從前台到service層再到domain層,spring中的切面就不再是一條線的開發方式,而是面向一個層,比如在配置事務的時候配置到service層,這就是切面的一個應用。過濾就是把提交的東西和展示到前台的東西篩選一遍,例如寫一個編碼的過濾器,在從前台想後台提交東西的時候,在到action之前,spring會把編碼設置成你想設置的編碼格式。

6. spring aop 可以捕獲日誌嗎

在Java開發中日誌的管理有很多種。我一般會使用過濾器,或者是spring的攔截器進行日誌的處理。如果是用過濾器比較簡單,只要對所有的.do提交進行攔截,然後獲取action的提交路徑就可以獲取對每個方法的調用。然後進行日誌記錄。使用過濾器的好處是可以自己選擇性的對某一些方法進行過濾,記錄日誌。但是實現起來有點麻煩。

另外一種就是使用Spring的AOP了。這種方式實現起來非常簡單,只要配置一下配置文件就可以了。可是這種方式會攔截下所有的對action的每個操作。使得效率比較低。不過想做詳細日誌這個方法還是非常好的。下面我就介紹一下使用Spring
AOP進行日誌記錄的方式。

spring aop可以做日誌管理

7. 45. 從零開始學springboot擼一個Xss過濾器-註解實現

上章通過Filter實現了Xss全局過濾器

可能小夥伴還有點不滿, 全局意味著「一刀切」,
雖然我們也有白名單黑名單設置, 但是, 白名單黑名單針對的是整個方法或整個實體類

舉個例子, 我定義了個實體

可能業務上有限制(比如name限制了只有5個字元長),

那麼name其實不可能存在Xss注入風險了,

程序只需要對info和des屬性做轉義即可

如果採用Filter, 意味著People的所有屬性都會檢測轉義, 好像沒啥必要!

那麼, 可以針對性的指定欄位進行Xss的過濾轉義么?

為了應對這樣的需求, 咸魚君採用Aop註解來實現這么個Xss過濾器.

PS: 和Filter一樣, 我們統一對入參Xss過濾, 確保參數的處理方式統一! 所以, 程序中獲取的參數值都是轉義後的數據!!

廢話不多說, 往下看!

加入必要的pom依賴

針對方法, 參數, 屬性分別定義三個註解

XssMethod

XssParam

XssField

針對註解實現切面Aspect

XssAspect

注釋寫的很詳細, 就不多廢話了!

接下來我們寫個案例來測試測試

首先在啟動類上啟用切面

定義一個實體People, 並對info,des屬性加上註解進行xss過濾

最後編寫controller

json方式

鍵值對方式

https://github.com/MrCoderStack/SpringBootDemo/tree/master/sb-xssaop

8. Spring AOP中@Aspect攔截介紹(一)

本章介紹的@Aspect攔截用的非註解方式,而是通過切入點@Pointcut指定要攔截的目錄,本章節實現了攔截請求和返參後對其進行修改,類似於過濾器的作用

User.java

AspectTestController.java

TestAspect.java

如果想要學習或者加上該封裝結構,可以在筆者的項目筆記目錄下尋找「項目返參結構封裝」就可以直接復制了,當然也可以自己返回一個String或者Object類型先測試用著

本測試例子中已經把 @Before和@After和@AfterReturning注掉了,只使用的@Around,可以直接用postman調用測試的,測完還可以放開前面三個註解,再把@Around注掉再測就可以了。

無參的那個測試不能用@Around測試,想要用@Around測試需要改一下,@Around("pointCut() && args(arg)")改為@Around("pointCut() "),下面的入參和修改參數部分去掉即可

9. spring中過濾器(filter)、攔截器(interceptor)和切面(aop)的執行順序

過濾器是服務端的一個組件,是基於servlet實現從客戶端訪問服務端web資源的一種攔截機制,對請求request和響應response都進行過濾,依賴於serverlet容器,使用時,實現Filter介面,在web.xml里配置對應的class還有mapping-url。

攔截器,顧名思義,它的作用就是攔截,這個要和過濾器區分開,過濾器依賴serverlet容器,獲取request和response處理,是基於函數回調(框架本身調用的,它會遍歷所有注冊的過濾器,並且一一調用doFilter()),簡單說就是「去取你想取的」。攔截器是通過Java反射機制來攔截web請求,是「拒你想拒絕的」,它只攔截web請求,但不攔截靜態資源。

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

相比過濾器,攔截器能夠知道用戶發出的請求最終被哪個控制器處理,但是攔截器還有一個明顯的不足,即不能夠獲取request的參數以及控制器處理之後的response。(注意 ,我曾經試過,獲得被攔截方法的一些參數,但是通過methodParaters無法獲得,後來只能通過request.getParameter(..)來獲取)所以就有了切片的用武之地了。

【Filter與Interceptor的區別】

【Interceptor 與spring AOP的區別】

10. spring過濾器和攔截器的區別和聯系

1、首先要明確什麼是攔截器、什麼是過濾器
1.1 什麼是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
1.2. 攔截器的實現原理:
大部分時候,攔截器方法都是通過代理的方式來調用的。Struts2的攔截器實現相對簡單。當請求到達Struts2的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-name>Redirect Filter</filter-name>
<filter-class>com.xx.filter.RedirectFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>Redirect 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);

}
}

閱讀全文

與springaop過濾器相關的資料

熱點內容
印染廢水中cod排放量是多少 瀏覽:245
冷干機的濾芯如何拆下來 瀏覽:552
海爾凈水器出水管介面怎麼拆 瀏覽:13
河北水垢漏斗 瀏覽:689
白雲區農村ppp污水項目 瀏覽:498
安吉爾水壺濾芯怎麼拆 瀏覽:318
電廠化學廢水調整及注意事項 瀏覽:892
什麼叫納米微晶技術凈化器 瀏覽:43
百佳境界凈水器如何 瀏覽:695
甲醇蒸餾塔再沸器的原理 瀏覽:268
ro膜氯化 瀏覽:984
潔廁靈能除垢 瀏覽:459
油煙機凈化器的價格多少錢一台 瀏覽:334
凈化器電源怎麼測量 瀏覽:332
wq污水提升泵 瀏覽:415
污水處理50戶需多少立方池 瀏覽:656
樹脂是不是ab膠 瀏覽:694
減壓蒸餾怎麼拆 瀏覽:544
飲水機為什麼加熱一會就保溫 瀏覽:287
電解法處理污水基於什麼原理 瀏覽:229