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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

HTTP请求和标头参数的CDI拦截器-简单示例

發(fā)布時(shí)間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HTTP请求和标头参数的CDI拦截器-简单示例 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在使用Java EE開(kāi)發(fā)和發(fā)展REST API的過(guò)程中,有些情況下您希望以更細(xì)粒度的方式(視情況而定)對(duì)傳入的HTTP請(qǐng)求(特別是標(biāo)頭參數(shù))進(jìn)行“觀察” Servlet過(guò)濾器或更具體的ContainerRequestFilters 。

我發(fā)現(xiàn)在某些情況下非常方便的一種可能方式是,在我的JAXRS Resource實(shí)現(xiàn)中添加CDI攔截器 ,該攔截器最終可以訪問(wèn)傳入的HTTP請(qǐng)求并執(zhí)行一些“自定義”邏輯。 作為開(kāi)發(fā)人員,我可以完全控制–只需添加或刪除自定義批注即可在哪個(gè)路徑(哪個(gè)路徑)中攔截請(qǐng)求。隨著Java EE 7的引入,混合“關(guān)注點(diǎn)”變得更加容易,因此您可以輕松注入對(duì)純CDI攔截器的HTTP請(qǐng)求 。

在下面,我僅記錄一個(gè)非常簡(jiǎn)單的示例,在該示例中,我使用自定義攔截器來(lái)“攔截”業(yè)務(wù)REST API上的HTTP請(qǐng)求,以便執(zhí)行一些非常特定的自定義身份驗(yàn)證邏輯。 我正在檢查在我的REST API中發(fā)起請(qǐng)求的“用戶”是否具有系統(tǒng)定義的某些特定自定義角色。 當(dāng)然,整個(gè)示例只是一個(gè)示例,但是您明白了。

為了引入這樣一個(gè)組件,您需要兩件事:

  • 引入自定義注釋,該注釋將在定義后用于激活攔截器
  • 實(shí)現(xiàn)CDI攔截器。
  • 在其余api的路徑/資源上應(yīng)用注釋

注釋界面

這里沒(méi)什么特別的,只是一個(gè)自定義的運(yùn)行時(shí)批注,因此我們可以使用它來(lái)“標(biāo)記” JAXRS API的特定方法。

package gr.javapapo.sample.cdi;/*** Created by <a href="mailto:javapapo@mac.com">javapapo</a> on 24/09/15.*/ import javax.enterprise.util.Nonbinding; import javax.interceptor.InterceptorBinding; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface CheckRequest {@Nonbinding String role() default "ADMIN"; }

攔截器的實(shí)現(xiàn)

值得注意的幾點(diǎn):

  • 攔截器已使用我們的自定義注釋“標(biāo)記”了-簡(jiǎn)單
  • 我們@Inject HttpServletReqest
  • 我們基于注釋詳細(xì)信息應(yīng)用一些自定義邏輯(我閱讀了定義中的所有參數(shù))
  • 從請(qǐng)求中,我讀取了標(biāo)頭并基于注釋參數(shù)-我做了一些基本的邏輯
package gr.javapapo.sample.cdi;import javax.inject.Inject; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.NotAllowedException;/*** CDI interceptor for the {@linkplain CheckRequest} annotation* Created by <a href="mailto:javapapo@mac.com">javapapo</a> on 24/09/15.*/ @Interceptor @CheckRequest public class CheckRequestInterceptor {@InjectHttpServletRequest request;@AroundInvokepublic Object checkAccess(InvocationContext ctx) throws Exception {CheckRequest annotation = ctx.getMethod().getAnnotation(CheckRequest.class);String role = annotation.role();String roleToken = request.getHeader("roleToken");if(roleToken==null && !role.equals(roleToken)){throw new NotAllowedException("Not allowed if your request does not have the roleToken header " +"or your role is not correct ");}return ctx.proceed();} }

應(yīng)用攔截器/注釋

最終,您可以注釋@Path JAXRS資源和方法,以便“踢”自定義邏輯:

@Path("/status") public class StatusResource {/*** Returns a simple JSON object, regarding the app status, n** @return Response <JsonObject>*/@GET@Produces(MediaType.APPLICATION_JSON)@CheckRequest(role="ADMIN")public Response getStatus() {JsonObject object = Json.createObjectBuilder().add("status", "Status with CDI internceptor check,It Works at " + LocalDateTime.now().toString()).build();Response.ResponseBuilder repBuilder = Response.ok().entity(object);return repBuilder.build();}
  • 您可以在github上這個(gè)非常簡(jiǎn)單的示例項(xiàng)目中找到所有文件。

翻譯自: https://www.javacodegeeks.com/2015/10/cdi-interceptor-of-http-request-and-header-params-simple-example.html

總結(jié)

以上是生活随笔為你收集整理的HTTP请求和标头参数的CDI拦截器-简单示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。