Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从micronaut上的MethodIntercector获取授权标头?_Java_Micronaut - Fatal编程技术网

Java 如何从micronaut上的MethodIntercector获取授权标头?

Java 如何从micronaut上的MethodIntercector获取授权标头?,java,micronaut,Java,Micronaut,在一切发生之前,我尝试了这两种解决方案,但都不适用于我 在我的应用程序中,我必须在授权头中获取一个字符串,然后从base64对其进行解码,并使用json将其转换为POJO。当然,字符串是jwt,我需要解码json的公共部分以从字段中获取数据。 从技术上讲,客户会将标题转发给我以获取、解码并提取数据。(这是非常糟糕的练习,但这是我必须做的) 为此,我使用micronaut 2.4.1,这是我的代码: 拦截器: public class HeadInterceptor implements Me

在一切发生之前,我尝试了这两种解决方案,但都不适用于我

在我的应用程序中,我必须在授权头中获取一个字符串,然后从base64对其进行解码,并使用json将其转换为POJO。当然,字符串是jwt,我需要解码json的公共部分以从字段中获取数据。
从技术上讲,客户会将标题转发给我以获取、解码并提取数据。(这是非常糟糕的练习,但这是我必须做的)

为此,我使用micronaut 2.4.1,这是我的代码:

拦截器:

public class HeadInterceptor implements MethodInterceptor<Object, Object> {
    @SneakyThrows
    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {

        Request request = (Request) context.getParameterValueMap().get("request");
        // Where do i get Authorization header?
        // i.e String token = (String) context.getParameterValueMap().get("Authorization");
        String token = "eyJhdWQiOiJ0ZXN0IiwiaXNzIjoidGVzdCIsInN1YiI6InRlc3QiLCJleHAiOjExMTExMTEsImlhdCI6MTExMTExMTEsImRhdGEiOiJ0ZXN0In0=";

        ObjectMapper mapper = new ObjectMapper();
        Info info = mapper.readValue(new String(Base64.getDecoder().decode(token)), Info.class);
        request.setData(info.getSub().toUpperCase());

        return context.proceed();
    }
}
...
String token = context.getParameterValueMap().get("authorization");
...
公共类HeadInterceptor实现MethodInterceptor{
@鬼鬼祟祟
@凌驾
公共对象截获(MethodInvocationContext){
请求=(请求)上下文。getParameterValueMap().get(“请求”);
//我在哪里获得授权标题?
//即字符串标记=(字符串)context.getParameterValueMap().get(“授权”);
String token=“Eyjhdwqioij0zxn0iiwiaxnzijoidgvzdcisinn1yii6inrlcjlehaiojexmtexmtesimlhdci6mtexmtesimrhdgeij0zxn0in0=”;
ObjectMapper mapper=新的ObjectMapper();
Info=mapper.readValue(新字符串(Base64.getDecoder().decode(token)),Info.class);
request.setData(info.getSub().toUpperCase());
返回上下文。继续();
}
}
控制器:

@Controller("/main")
public class MainController {

    @Post
    @Head
    public Single<Response> index(@Body @Valid Request request) {
        return Single.just(
                Response.builder()
                        .message(String.format("%s-%s", request.getData(), request.getInfo()))
                        .build()
        );
    }
}
@Controller(“/main”)
公共类主控制器{
@职位
@头
公共单索引(@Body@Valid-Request){
单程返回(
Response.builder()
.message(String.format(“%s-%s”、request.getData()、request.getInfo())
.build()
);
}
}
下面是一个示例应用程序

(忽略其他问题的名称)

为了解决问题,您可以先将问题分解为几个部分

第1部分:如何获取任意标题(或列出所有标题)

尝试使用
request.getHeaders()

第2部分:如何获取名为授权的标题

使用第1部分中的方法。另外,要小心这个案子。例如,
授权
是否与
授权
相同


方法2: 在控制器()中:

为什么代码看起来像这样

  • 首先使用参数注入获取所需的auth头
  • 其次,回顾AOP/AspectJ的基本概念(拦截器类使用的)。在您的拦截器中,您截取了一个方法(在您的例子中,是controller中的
    index
    方法。因此,您可以很高兴地获得该方法的参数。在上面的代码中,仅截取
    authorization
    参数

  • 请告诉我您是否被困在某个地方(并粘贴代码和输出)。

    在您的实现中,由于您的
    index
    方法没有将标题作为参数接收,因此无法在拦截器中显示标题

    因此,如果将其作为参数添加,如下所示:

    ...
    @Post
    @Head
    public Single<Response> index(@Body @Valid Request request, @Header("Authorization") String authorizationHeader) {
        return Single.just(
                Response.builder()
                        .message(String.format("%s-%s", request.getData(), request.getInfo()))
                        .build()
        );
    }
    ...
    
    public class Request {
        @NotNull
        @NotBlank
        private String info;
        private String data;
    
        @Header("Authorization")
        String authorizationHeader;
    } 
    
    更新 由于您希望您的
    请求既包含正文又包含标题,因此我对解决方案进行了一些编辑。基本上,标题作为成员变量添加到
    请求中,如下所示:

    ...
    @Post
    @Head
    public Single<Response> index(@Body @Valid Request request, @Header("Authorization") String authorizationHeader) {
        return Single.just(
                Response.builder()
                        .message(String.format("%s-%s", request.getData(), request.getInfo()))
                        .build()
        );
    }
    ...
    
    public class Request {
        @NotNull
        @NotBlank
        private String info;
        private String data;
    
        @Header("Authorization")
        String authorizationHeader;
    } 
    
    然后,在
    请求
    参数上使用
    @RequestBean
    而不是
    @Body
    注释:

    ...
    @Post
    @Head
    public Single<Response> index(@RequestBean @Valid Request request) {
        return Single.just(
                Response.builder()
                        .message(String.format("%s-%s", request.getData(), request.getInfo()))
                        .build()
        );
    }
    ...
    
    我为此更改创建了一个拉取请求,因此您可以检查它的工作方式

    @SneakyThrows
    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {
        ...   
        Request request = (Request) context.getParameterValueMap().get("request");
        String token = request.authorizationHeader;
        ...
    }