获取http请求标头_HTTP请求和标头参数的CDI拦截器–简单示例

获取http请求标头

在使用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请求标头

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

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

相关文章

java多线程区别_Java中实现多线程的两种方式之间的区别

Java提供了线程类Thread来创建多线程的程序。其实&#xff0c;创建线程与创建普通的类的对象的操作是一样的&#xff0c;而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程&#xff0c;有两种方法&#xff1a;◆需要从Java.lang.Thre…

詹金斯搭建_与詹金斯一起将GitLab中的Gradle项目发布到Artifactory

詹金斯搭建我将详细展示如何定期构建您的项目&#xff0c;然后如何进行发布。 它涉及许多工具的协作&#xff0c;我发现很难正确设置这些工具&#xff0c;这就是我编写此代码的原因。 目标 我将向您展示如何实现以下两种方案。 第一个是如何进行常规开发的非发行版&#xff1a…

java socket优化_Java Socket编程代码优化

1.问题&#xff1a;在学习Java的Socket编程&#xff0c;写了一些代码练习&#xff0c;但是又不知道是否规范&#xff0c;是否有优化的空间&#xff1f;2.代码&#xff1a;package com.nekolr.socket;import com.google.common.util.concurrent.ThreadFactoryBuilder;import jav…

java 函数式编程_Java函数式编程:Javaslang入门

java 函数式编程Java是一门古老的语言&#xff0c;并且该领域中有很多新手在他们自己的领域&#xff08;JVM&#xff09;上挑战Java。 但是Java 8到来并带来了一些有趣的功能。 这些有趣的功能使编写新的惊人框架&#xff08;例如Spark Web框架或Javaslang&#xff09;成为可能…

java 线程组作用_Java线程组(ThreadGroup)使用

JDK 对线程组类注释&#xff1a;A thread group represents a set of threads. In addition, a thread group can also include other thread groups. The thread groups form a tree in which every thread group except the initial thread group has a parent.A thread is a…

web.xml.jsf_JSF 2.2在30秒内创建一个自定义Hello World组件

web.xml.jsf让我们直接跳到很酷的东西上&#xff0c;说在JSF 2.0中&#xff0c;通过在Facelet标记库&#xff08; *taglib.xml &#xff09;中对其进行配置&#xff0c;使页面作者可以使用自定义组件。 此外&#xff0c;当将组件映射到JAR中时&#xff0c;需要在web.xml一个特殊…

java左上角图标太小_Eclipse在高分屏下图标过小的解决方法

自己败了一台Surface Pro 4&#xff0c;打算用来看PDF、练代码。安装了Eclipse并且打开之后&#xff0c;发现图标显示极其细小&#xff0c;肉眼几乎无法看清了。这是由于Eclipse对高分屏没有作适配导致的。Windows 10本身对于高分屏的支持已是相当不错&#xff0c;苏菲4的屏幕分…

java胜任理由_Java在几乎所有方面均能胜任本机响应

java胜任理由我与一位同事讨论了Java与JavaScript的话题&#xff0c;这是一个有问题的话题。 然后他提到React Native多么出色&#xff0c;我决定我必须研究一下&#xff0c;也许要为Codename One掌握一些想法…… 那里有一些不错的主意&#xff0c;但是它们都不是革命性的或例…

java发送文件_java 模拟http发送文件和参数

一、maven&#xff1a;org.apache.httpcomponentshttpmime4.5.3二、工具类&#xff1a;import java.io.File;import java.util.Map;import java.util.Map.Entry;import org.apache.http.*;import org.apache.http.client.HttpClient;import org.apache.http.client.config.Requ…

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

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

java字节码反编译_javap 反编译 java 字节码文件

概述&#xff1a;javap是 Java class文件分解器&#xff0c;可以反编译&#xff0c;也可以查看java编译器生成的字节码&#xff0c;从而对代码内部的执行逻辑进行分析。语法&#xff1a;把java文件编译为class文件&#xff1a;javac Test.java (Test.java为java文件名) 生成对…

javaone_JavaOne演讲者选择了您不容错过的10个会话

javaone确保会议安排中包含这些JavaOne会话 JavaOne 2015从这个星期日开始&#xff0c;数百个会话同时进行&#xff0c;因此很难筛选所有会话并选择要参加的会话。 这就是为什么我们邀请5位最喜欢的JavaOne发言人让我们了解他们的会议&#xff0c;并选择他们最期待的会议。 好…

java servlet文件下载_Java之Servlet文件下载20190228

jsp页面:pageEncoding"utf-8"%>Insert title here下载index.jsp下载1.jpg下载test.jspServlet:packageorg.jimmy.testwebproject2019012602.servlet.download;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjavax.se…

activiti 多租户_Activiti中具有独立数据库架构的多租户

activiti 多租户我们过去听到的一项功能请求是以多租户方式运行Activiti引擎&#xff0c;使租户的数据与其他数据隔离。 当然&#xff0c;在某些云/ SaaS环境中&#xff0c;这是必须的。 几个月前&#xff0c;波恩大学的学生拉斐尔吉伦&#xff08;Raphael Gielen&#xff09;…

jigsaw kaggle_使用Project Jigsaw的JDK 9 Early Access上的Eclipse IDE

jigsaw kaggle几周前&#xff0c;我写了关于在Java 9上运行Eclipse Neon的文章 &#xff08;尽管&#xff0c;我在帖子标题中错误地且令人尴尬地留下了“火星”&#xff09;。 值得注意的是&#xff0c;我列出的步骤也适用于带有Project Jigsaw &#xff08;Java模块化&#xf…

win7 activemq_带有骆驼,ActiveMQ,Elasticsearch的关键HL7用例

win7 activemqML7上的HL7是可以说HL7协议格式的系统的一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台&#xff0c;在为关键医疗保健提供者构建灵活&#xff0c;有弹性&#xff0c;高可用性的集成方案方面拥有良好的经验。 此外&#xff0c;在JCAPS上替…

jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7

jboss4 迁移几周前&#xff0c;我发布了一个有关从Java EE 5迁移到7的博客 。这主要是关于如何使用新的Java EE 7改进Java EE 5代码。 现在&#xff0c;在这篇文章中&#xff0c;我将对应用程序服务器端的迁移路径进行一些研究。 如果您使用的是Java EE 5&#xff0c;则很有可…

java xmlrpc2.0 实现_简单的java xmlrpc

&#xfeff;&#xfeff;简单的 XMLRPCjava---XmlRpcClientpackage com.company;import org.apache.xmlrpc.XmlRpcClient;import org.apache.xmlrpc.XmlRpcException;import java.net.MalformedURLException;import java.util.Hashtable;import java.util.Vector;public class…

操作方法:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf&#xff0c;并且需要在视图中格式化Java 8 Date&#xff06;Time对象&#xff0c;则可以使用thymeleaf-extras-java8time –用于Java 8 Date&#xff06;Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

java boundary_上传文件multipart form-data boundary 说明

含义 ENCTYPE"multipart/form-data" 说明&#xff1a;通过 http 协议上传文件 rfc1867协议概述&#xff0c;客户端发送内容构造。概述在最初的 http 协议中&#xff0c;没有上传文件方面的功能。 rfc1867为 http 协议添加了这个功能。客户端的浏览器&#xff0c;如 M…