所有OSGi套件的通用CXF请求拦截器
幾個(gè)月以來,我一直在研究Apache CXF,Karaf和Felix,我發(fā)現(xiàn)所有這些捆綁技術(shù)都非常有趣。 在處理一些用例時(shí),我陷入一種情況,即我只需要一個(gè)Interceptor即可在發(fā)送到Karaf應(yīng)用程序下部署的任何捆綁包的每個(gè)HTTP請(qǐng)求上執(zhí)行。
基本上,我想對(duì)每個(gè)請(qǐng)求進(jìn)行授權(quán),更改一些標(biāo)頭,并對(duì)已發(fā)送給系統(tǒng)的任何請(qǐng)求進(jìn)行一些安全檢查,最重要的是,我想在一個(gè)類中進(jìn)行處理。 我發(fā)現(xiàn)了在每個(gè)捆綁中添加攔截器的許多方法,但我想在某個(gè)集中的位置/捆綁中執(zhí)行此操作,以便可以從該捆綁中處理所有請(qǐng)求。 執(zhí)行某些授權(quán)后,它可以簡(jiǎn)單地拒絕任何請(qǐng)求,也可以將其傳遞給相關(guān)的包(cxf在內(nèi)部執(zhí)行)。
在這樣做的時(shí)候,我知道CXF總是為每個(gè)在捆綁軟件藍(lán)圖中初始化的RestServer創(chuàng)建一個(gè)單獨(dú)的BUS。 但是要實(shí)現(xiàn)我的目標(biāo),我們必須在同一總線上注冊(cè)所有捆綁包,并將攔截器應(yīng)用于該總線。 這樣,我們可以控制總線上所有的請(qǐng)求。
通用攔截器
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();}} }上面是常見的攔截器代碼,您可以在其中使用正在發(fā)送到服務(wù)器的請(qǐng)求來執(zhí)行任何操作。 在構(gòu)造函數(shù)中,我正在分配將攔截器連接到的階段。 CXF有多個(gè)階段。 您可以獲取有關(guān)“階段”鏈接的信息: CXF中的“階段”。
擴(kuò)展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 ##############" );} } }在上面的代碼中,我正在擴(kuò)展AbstractFeature類,并連接initilizeProvider方法。 然后我給我們的普通巴士起了個(gè)名字。 基本上,只要安裝了任何OSGi捆綁軟件,它都會(huì)在總線上進(jìn)行注冊(cè)。 在這種情況下,我們要檢查捆綁包是否具有所需的總線ID。 該總線ID在整個(gè)系統(tǒng)范圍內(nèi)都是唯一的,具有該總線ID的所有捆綁包都將注冊(cè)到同一總線,并且與這些捆綁包相關(guān)的每個(gè)請(qǐng)求都將首先發(fā)送到CommonInterceptor。
捆綁包中的公交車注冊(cè):
<cxf:bus id="javapitshop_bus"><cxf:features><cxf:logging /></cxf:features></cxf:bus>要在同一總線上注冊(cè)捆綁包,您必須給該總線賦予一個(gè)ID并將其注冊(cè)在捆綁包的blueprint.xml文件中。 在所有相關(guān)的捆綁軟件中執(zhí)行此操作,所有這些捆綁軟件都將分配有相同的總線,并且CommonInterceptor將自動(dòng)實(shí)現(xiàn)到所有捆綁軟件。
- 您可以從我的Github下載完整的源代碼。
翻譯自: https://www.javacodegeeks.com/2014/11/a-common-cxf-request-interceptor-for-all-osgi-bundles.html
總結(jié)
以上是生活随笔為你收集整理的所有OSGi套件的通用CXF请求拦截器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器可以再接路由器吗?
- 下一篇: 如何为JBoss Developer S