gpt4 book ai didi

java - Jax-RS - 获取 header 值的自定义属性

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:50 32 4
gpt4 key购买 nike

编辑:我刚刚意识到,是否可以在 Java 中使用自定义属性执行自定义操作?还是仅供引用?

我想在我的 Jax-RS 服务 header 中包含一个身份验证 token ,但我不想向每个请求添加一个参数来获取 header 并像这样检查它:

public Response getUser(@Context HttpHeaders headers) {
if(authorize(headers.getRequestHeader("token").get(0)) {
// Do something
}
}

我宁愿为每个请求添加一个属性(如果可能的话,甚至是类:

@Authorize
public Response getUser() {
// Do something
}

这样我也可以只将属性添加到我想要的请求中。

如果请求未获授权,我可以覆盖它并返回 401。

自定义属性好写,但是如何获取属性中的header信息而不每次都传入呢?

注意:我宁愿不使用 web.xml。我现在没有,我不喜欢使用它们。我想在没有 xml 的情况下保持我的代码干净,我认为如果我使用 filter/web.xml 它将适用于所有调用。如果那是唯一的方法,我会的,但我更喜欢使用自定义属性的方法。

最佳答案

"I think if I used a filter/web.xml it would apply to all calls"

其实有@NameBinding我们可以使用的注释。例如

@NameBinding
@Rentention(RetentionPoilicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Authorize {}

然后只需注释过滤器和您要过滤的方法/类即可。

@Authorize
public Response getUser() {
// Do something
}

@Provider
@Authorize
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationRequestFilter implements ContainerRequestFilter {

@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {

MultivauledMap<String, String> headers - requestContext.getHeaders();
...
if (!authorized) {
throw new NotAuthorizedException();
}
}
}

注意 @Priority 的使用.这个很重要。假设您还需要身份验证,因此您创建了一个用于身份验证的过滤器。如果您不设置优先级,则任一过滤器都可能首先出现。这是不可预测的。如果我们为身份验证过滤器提供 @Priority(Priorities.AUTHENTICATION),那么该过滤器将始终出现在 @Priority(Priorities.AUTHORIZATION) 过滤器之前。

您还需要在 Application 子类中注册此过滤器(参见其他一些 Deployment Options (Jersey, but the Application subclass is portable with implementations) )

@ApplicationPath("/api")
public class YourApplication extends Application {
private Set<Class<?>> classes = new HashSet<>();
private Set<Object> singletons = new HashSet<>();

public YourApplication() {
classes.add(AuthorizationRequestFilter.class);
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
@Override
public Set<Object> singletons() {
return singletons;
}
}

关于java - Jax-RS - 获取 header 值的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27208153/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com