获取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请求标头_HTTP请求和标头参数的CDI拦截器–简单示例相关推荐

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

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

  2. dio拦截器 flutter_详解flutter之网络请求dio,请求,拦截器简单示例

    flutter一直很火的网络请求插件dio 直接上代码,写成一个类,可以直接使用 包含请求的封装,拦截器的封装 import 'package:dio/dio.dart'; import 'dart: ...

  3. PHP 函数调用次数,php获取页面执行时间,数据库读写次数,函数调用次数等(THINKphp)的简单示例...

    感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!THINKphp里面有调试运行状态的效果: Process:0.2463s (Load:0.0003s Init:0.0010s Exec:0.1 ...

  4. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  5. 拦截器获取请求参数post_spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  6. python自动搜索请求失败_http请求 request失败自动重新尝试代码示例

    本文研究的主要是http请求 request失败自动重新尝试的一个例子,具体如下. 需求 最近开发一个项目,要实现的一个场景是对于某个http请求,如果请求失败,需要再自动尝试几次,并记录异常原因便于 ...

  7. springmvc拦截器对请求参数解密_SpringMVC拦截器如何修改请求参数

    拦截器1,基本拦截器: package cn.ijava.interceptor; import javax.servlet.http.HttpServletRequest; import javax ...

  8. java ajax无权限跳转_ajax请求重定向后页面不跳转问题 (使用拦截器)

    一.ajax重定向的问题. 默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不重新加载页面的.如果需要用到重定向可以通过以下方法: 第一步:后端代码改造. 在后端(大部分情况都是拦截器)中 ...

  9. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...

最新文章

  1. 一个简单的Makefile
  2. gson解析天气json_几种常用JSON解析库性能比较
  3. 推荐算法炼丹笔记:如何让你的推荐系统具有可解释性?
  4. ITK:在图像中存储非像素数据
  5. [Python人工智能] 二十四.易学智能GPU搭建Keras环境实现LSTM恶意URL请求分类
  6. zabbix实现mysql数据库的监控
  7. homebrew 常用命令
  8. ulua 动态反射在IOS上的问题
  9. Java 目录操作二(获取文件的上级目录、获取目录最后修改时间、打印目录结构、遍历指定目录下的所有目录)
  10. [UI界面]-UIWindow
  11. 2.6.24内核中对S3C2440的引导启动分析
  12. 如何将 Mac 置入睡眠状态或唤醒 Mac?
  13. C语言面试题分类-位运算
  14. HTML5 WebRTC API无需网络获取本地IP
  15. 图书馆占座系统(二)
  16. mysql中使用触发器实例
  17. python正交表结果生成
  18. 在一线城市生活一辈子需要多少钱
  19. php制作特效文字,PPT制作文字特效 PPT特效文字制作教程
  20. CSDN 中 MarkDown编辑器自动生成目录

热门文章

  1. P7294-[USACO21JAN]Minimum Cost Paths P【单调栈】
  2. jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】
  3. jzoj3850-Fibonacci进制【斐波那契倍增】
  4. 欢乐纪中某A组赛【2019.7.5】
  5. jzoj4637-大鱼海棠【博弈论】
  6. P3385-[模板]负环【SPFA】
  7. 【ST表】【单调队列】Window(jzoj 1326)
  8. js Date 函数方法
  9. Oracle入门(十二H)之设置、恢复和删除不可用列
  10. 你必须了解Spring的生态