日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

所有OSGi套件的通用CXF请求拦截器

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 所有OSGi套件的通用CXF请求拦截器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

幾個月以來,我一直在研究Apache CXF,Karaf和Felix,我發現所有這些捆綁技術都非常有趣。 在處理一些用例時,我陷入一種情況,即我只需要一個Interceptor即可在發送到Karaf應用程序下部署的任何捆綁包的每個HTTP請求上執行。

基本上,我想對每個請求進行授權,更改一些標頭,并對已發送給系統的任何請求進行一些安全檢查,最重要的是,我想在一個類中進行處理。 我發現了在每個捆綁中添加攔截器的許多方法,但我想在某個集中的位置/捆綁中執行此操作,以便可以從該捆綁中處理所有請求。 執行某些授權后,它可以簡單地拒絕任何請求,也可以將其傳遞給相關的包(cxf在內部執行)。

在這樣做的時候,我知道CXF總是為每個在捆綁軟件藍圖中初始化的RestServer創建一個單獨的BUS。 但是要實現我的目標,我們必須在同一總線上注冊所有捆綁包,并將攔截器應用于該總線。 這樣,我們可以控制總線上所有的請求。

通用攔截器

public class CommonInterceptor extends AbstractPhaseInterceptor {public CommonInterceptor() {super(Phase.PRE_PROTOCOL);}public void handleMessage(Message message) throws Fault {/*** Here write whatever logic you want to implement on each HTTP call sent to your project.* * This interceptor will be called on every request that is being recieved by container and then will be sent* to the relevant bundle/class for handling.*/String url = ( String ) message.get( URL_KEY_ );String method = ( String ) message.get( Message.HTTP_REQUEST_METHOD );LOGGER.debug( "################### Authentication Interceptor Validating Request : " + url + "####################" );Map< String, List< String >> headers = Headers.getSetProtocolHeaders( message );if ( headers.containsKey( X_AUTH_TOKEN ) ) {return;}else{message.getInterceptorChain().abort();}} }

上面是常見的攔截器代碼,您可以在其中使用正在發送到服務器的請求來執行任何操作。 在構造函數中,我正在分配將攔截器連接到的階段。 CXF有多個階段。 您可以獲取有關“階段”鏈接的信息: CXF中的“階段”。

擴展AbstractFeature:

public class InterceptorManager extends AbstractFeature {private static final String COMMON_BUS_NAME = "javapitshop_bus";private static final Logger LOGGER = LoggerFactory.getLogger(InterceptorManager.class);private static final Interceptor< Message > COMMON_INTERCEPTOR = new CommonInterceptor();protected void initializeProvider(InterceptorProvider provider, Bus bus) {if ( COMMON_BUS_NAME.equals( bus.getId() ) ) {LOGGER.debug( " ############## Registering Common Interceptor on BUS ##############" );bus.getInInterceptors().add( COMMON_INTERCEPTOR );} else {LOGGER.error( " ############## Bus Id: '" + bus.getId() + "' doesn't matched with system bus id ##############" );} } }

在上面的代碼中,我正在擴展AbstractFeature類,并連接initilizeProvider方法。 然后我給我們的普通巴士起了個名字。 基本上,只要安裝了任何OSGi捆綁軟件,它都會在總線上進行注冊。 在這種情況下,我們要檢查捆綁包是否具有所需的總線ID。 該總線ID在整個系統范圍內都是唯一的,具有該總線ID的所有捆綁包都將注冊到同一總線,并且與這些捆綁包相關的每個請求都將首先發送到CommonInterceptor。

捆綁包中的公交車注冊:

<cxf:bus id="javapitshop_bus"><cxf:features><cxf:logging /></cxf:features></cxf:bus>

要在同一總線上注冊捆綁包,您必須給該總線賦予一個ID并將其注冊在捆綁包的blueprint.xml文件中。 在所有相關的捆綁軟件中執行此操作,所有這些捆綁軟件都將分配有相同的總線,并且CommonInterceptor將自動實現到所有捆綁軟件。

  • 您可以從我的Github下載完整的源代碼。

翻譯自: https://www.javacodegeeks.com/2014/11/a-common-cxf-request-interceptor-for-all-osgi-bundles.html

總結

以上是生活随笔為你收集整理的所有OSGi套件的通用CXF请求拦截器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。