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

在使用Java EE开发和发展REST API的过程中,有些情况下您希望以更细粒度的方式(视情况而定)对传入的HTTP请求(特别是标头参数)进行“观察” Servlet过滤器或更具体的ContainerRequestFilters 。

我发现在某些情况下非常方便的一种可能方式是,在我的JAXRS Resource实现中添加CDI拦截器 ,该拦截器最终可以访问传入的HTTP请求并执行一些“自定义”逻辑。 作为开发人员,我可以完全控制–只需添加或删除自定义批注即可在哪个路径(哪个路径)中拦截请求。随着Java EE 7的引入,混合“关注点”变得更加容易,因此您可以轻松注入对纯CDI拦截器的HTTP请求 。

在下面,我仅记录一个非常简单的示例,在该示例中,我使用自定义拦截器来“拦截”业务REST API上的HTTP请求,以便执行一些非常特定的自定义身份验证逻辑。 我正在检查在我的REST API中发起请求的“用户”是否具有系统定义的某些特定自定义角色。 当然,整个示例只是一个示例,但是您明白了。

为了引入这样一个组件,您需要两件事:

  • 引入自定义注释,该注释将在定义后用于激活拦截器
  • 实现CDI拦截器。
  • 在其余api的路径/资源上应用注释

注释界面

这里没什么特别的,只是一个自定义的运行时批注,因此我们可以使用它来“标记” 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";
}

拦截器的实现

值得注意的几点:

  • 拦截器已使用我们的自定义注释“标记”了-简单
  • 我们@Inject HttpServletReqest
  • 我们基于注释详细信息应用一些自定义逻辑(我阅读了定义中的所有参数)
  • 从请求中,我读取了标头并基于注释参数-我做了一些基本的逻辑
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();}
}

应用拦截器/注释

最终,您可以注释@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上这个非常简单的示例项目中找到所有文件。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

csgo服务器搭建 linux,请问搭建csgo服务器切换创意工坊地图报错怎么办

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Unknown command "sv_maxcmdrate"Unknown command "cash_team_elimination_hostage_map"Unknown command "cash_team_win_by_time_running_out"Unknown command "sv_vote_creation_time"W…

1405 树的距离之和

1405 树的距离之和 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB给定一棵无根树&#xff0c;假设它有n个节点&#xff0c;节点编号从1到n, 求任意两点之间的距离&#xff08;最短路径&#xff09;之和。Input第一行包含一个正整数n (n < 100000)&#xff0c…

linux c 11 运行库,11.1.3 运行库与I/O

11.1.3 运行库与I/O在了解了glibc和MSVC的入口函数的基本思路之后&#xff0c;让我们来深入了解各个初始化部分的具体实现。但在具体了解初始化之前&#xff0c;我们要先了解一个重要的概念&#xff1a;I/O。IO(或I/O)的全称是Input/Output&#xff0c;即输入和输出。对于计算…

设置Elasticsearch N-Gram Word分析器的过程

说n-gram是一个大话题&#xff0c;这是轻描淡写的。 进行快速搜索&#xff0c;您会发现自己盯着语言学和语言模型&#xff0c;数据挖掘或特定蛋白质的分解对首次亮相文化的衰落所隐含的信息量。 好吧&#xff0c;我在跟那最后一个开玩笑。 但是&#xff0c;如果您是开发人员&a…

linux windows 丢失,Win10预览版9879硬盘丢失的Linux解决方案

IT之家讯 12月3日消息&#xff0c;最近IT之家论坛网友九仙仙总结了Win10预览版9879硬盘问题的解决方法&#xff0c;并在论坛中发布出来。经测试&#xff0c;此为快速有效的解决方法&#xff0c;故公之于众供朋友们参考。以下为作者原文。开头说明两点&#xff1a;1、这是我个人…

linux单网卡多拨Adsl,ROS单线多拨pppoe

#设置内网IP地址/ ip add add interfaceether1address192.168.0.254/255.255.255.0#设置共享上网/ ip firewall nat add actionmasquerade chainsrcnatsrc-address192.168.0.0/255.255.255.0#设置ADSL拔号/ interface pppoe-client add name"pppoe-out1" interfaceet…

Android开发——Android系统启动以及APK安装、启动过程

0. 前言 从Android手机打开开关&#xff0c;到我们可以使用其中的app时&#xff0c;这个启动过程到底是怎么样的&#xff1f;1. 系统上电当给Android系统上电&#xff0c;在电源接通的瞬间&#xff0c;CPU内的寄存器和各引脚均会被置为初始状态&#xff0c;CPU复位之后&#…

linux生成文件清单,Linux 获取文件名称生成列表 txt - create_filelist

Linux 获取文件名称生成列表 txt - create_filelist1. find/home/strong/MOTChallenge/MOT16/MOT16/train/MOT16-04/img1/ 文件夹下所有 *.jpg (000001.jpg - 001050.jpg) 的路径 图片名信息写入 txt 文件。1.1 llstrongforeverstrong:~/MOTChallenge/MOT16/MOT16/train/MOT16…

jvm线程分析命令_JVM:如何分析线程转储

jvm线程分析命令本文将教您如何分析JVM线程转储&#xff0c;并查明问题的根本原因。 以我的观点&#xff0c;线程转储分析是掌握Java EE生产支持的任何个人最重要的技能。 您可以从线程转储快照中获取的信息量通常远远超出您的想象。 我的目标是与您分享我在过去10年中积累的有…

[na]华为acl(traffic-filter)和dhcp管理

这个是财务网络的一个问题, 要求财务的某台机器能访问其他部门区的打印机. 其他部门是不能访问到财务网络的. 华为alc配置实例:-traffic-filter # 在VLAN100上配置基于ACL的报文过滤&#xff0c;允许源IP地址为192.168.0.2/32的报文通过&#xff0c;丢弃其他报文。 <HUAWEI&…

svn 1.6 linux 下载,LINUX下Subversion1.6.17 部署

1、服务器版本和安装软件服务器版本&#xff1a;Redhat Enterprise 5.5 32bit安装软件&#xff1a;apr-1.3.12.tar.gzapr-util-1.3.12.tar.gzhttpd-2.2.9.tar.gzsqlite-amalgamation-3.7.3.tarsubversion-1.6.17.tar.bz2subversion-deps-1.6.17.tar.bz22、安装检查操作系统http…

JBoss Fuse –使用MVEL将您的静态配置转换为动态模板

最近&#xff0c;我重新发现了我遗忘的JBoss Fuse功能&#xff0c;并且我认为其他人可能会从此提醒中受益 。 这篇文章将重点放在JBoss Fuse和Fabric8上&#xff0c;但所有正在寻找最小侵入性方法来为其静态配置文件添加一定程度的动态支持的开发人员也可能会对此感兴趣。 在…

在linux中dns不安装coching,ubuntu 8.04下openldap的安装和使用

ubuntu 8.04上openldap的安装和使用1、安装openldap。$ sudo apt-get install slapd ldap-utils2、配置openldap。$ sudo /etc/ldap/slapd.conf需要修改的有以下4处。# The base of your directory in database #1# 域名前缀suffix "dcpeercoaching,dccn"# …

linux 拿shell,linux下备份拿shell[渗透必备]

关于php包含Apache日志的利用,其实也就是利用提交的网址里有php语句&#xff0c;然后再被Apache服务器的日志记录&#xff0c;然后php再去包含执行&#xff0c;从而包含了去执行。当然&#xff0c;这种办法最大的弊端是Apache日志肯定会过大&#xff0c;回应的时候当然会超时什…

信息系统开发内容

1.按照用于质量管理的能力成熟度模型&#xff08;CMM&#xff09;描述系统开发过程的动机。 2.区分系统生命周期和系统开发方法 3.描述系统开发的10个基本原理 4.定义问题、机会和指示——系统开发项目的能力 5.描述用于把问题、机会和指示进行分类的PIECES框架 6.描述系统开发…

jee neow_JEE7:展望新时代

jee neow计划于2012年下半年发布的Java EE 7预计的JSR都已启动并正在运行。 Java EE 7发行版是日期驱动的&#xff0c;它将反映该行业迁移到云中时不断变化的需求&#xff1a;任何未准备就绪的内容将推迟到Java EE 8中使用 。 这是Java EE 7平台中不同规范的关键功能的更新和摘…

Linux怎么更改声音板卡顺序,51CTO博客-专业IT技术博客创作平台-技术成就梦想

SUN M8000主机 IOU板卡硬件更换一、故障现象1.日志分析XSCF> showstatus*IOU#0 Status:Degraded;XSCF> showlogs -v errorDate: May 24 20:44:22 CST 2019 Code: 80002000-33010000-0167058a00000000Status: Alarm Occurred: May 24 20:44:20.367 C…

Class.getResource和ClassLoader.getResource的区别分析

原文&#xff1a;http://swiftlet.net/archives/868 在Java中获取资源的时候&#xff0c;经常用到Class.getResource和ClassLoader.getResource&#xff0c;本文给大家说一下这两者方法在获取资源文件的路径差异。Class.getResource(String path)path不以/开头时&#xff0c;默…

设计模式的Java 8 Lambda表达式–命令设计模式

在本博客中&#xff0c;我将说明如何使用Java 8 Lambda表达式以函数式编程方式实现命令模式 。 命令模式的目的是将请求封装为对象&#xff0c;从而为具有不同请求&#xff0c;队列或日志请求的客户端参数化&#xff0c;并支持相应的操作。 命令模式是一种编写通用代码的方法&a…

凝思linux系统显卡设置,TaiShan服务器安装凝思操作系统Linx6.0.90并设置独立显卡WX2100输出...

TaiShan服务器安装凝思操作系统Linx6.0.90并设置独立显卡WX2100输出环境准备&#xff1a;TaiShan 2280服务器&#xff0c;凝思操作系统Linx6.0.90 arm64&#xff0c;WX2100显卡&#xff0c;WX2100显卡固件和驱动安装包第1步&#xff0c;上电服务器&#xff0c;登录BMC输入用户名…