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: 在控制器()中: 为什么代码看起来像这样:
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;
...
}