gpt4 book ai didi

java - 将@Context参数传递给类中的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:09 24 4
gpt4 key购买 nike

我有一个现有的类,我正在尝试 Hook 以获取一些 header 参数,以便将用户 SSO 到我们的系统中。类如下。

import java.util.Map;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;

import org.springframework.stereotype.Component;

@Component
@Path("/http")
public class HttpResource {
@GET
@Path("/getHeaders")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> getAllHeaders(@Context HttpHeaders headers) {
Map<String, String> headerList = new HashMap<String, String>();
for (String key : headers.getRequestHeaders().keySet()) {
String value = headers.getRequestHeader(key).get(0);
System.out.println(key + " : " + value);
headerList.put(key, value);
}
return headerList;
}
}

我想弄清楚的是如何使用 @Context 参数调用 getAllHeaders()?我已经找到了大量关于我所拥有的类(class)的示例,但没有任何内容说明如何调用它。

我也试过将注释放在类中而不是作为参数。

@Context
HttpHeaders httpHeaders;

但是当我尝试访问 httpHeaders.getAllHeaders() 时,它返回 null。我假设是因为它实际上并没有创建,因为 javax 文档说它永远不会返回 null。

我试图在我的 SSOAuthorizationFilter.java 中调用它,但也尝试通过 Controller 访问它。

最佳答案

先写一个Annotation。

@Retention(RUNTIME)
@Target({ PARAMETER })
@Documented
public @interface SSOAuthorization {}

然后是解析器。

public class SSOAuthorizationResolver {

public static class SSOAuthorizationInjectionResolver extends
ParamInjectionResolver<SSOAuthorization> {
public SSOAuthorizationInjectionResolver() {
super(SSOAuthorizationValueFactoryProvider.class);
}
}


@Singleton
public static class SSOAuthorizationValueFactoryProvider extends
AbstractValueFactoryProvider {

@Context
private HttpHeaders httpHeaders;

@Inject
public SSOAuthorizationValueFactoryProvider(
final MultivaluedParameterExtractorProvider mpep,
final ServiceLocator injector) {
super(mpep, injector, Parameter.Source.UNKNOWN);
}

@Override
protected Factory<?> createValueFactory(final Parameter parameter) {
final Class<?> classType = parameter.getRawType();

if (!Language.class.equals(classType)
|| parameter.getAnnotation(SSOAuthorization.class) == null) {
return null;
}

return new AbstractContainerRequestValueFactory<String>() {
@Override
public String provide() {
// Can use httpHeader to get your header here.
return httpHeader.getHeaderString("SSOAuthorization");
}
};
}

}

// Binder implementation
public static class Binder extends AbstractBinder {
@Override
protected void configure() {

bind(SSOAuthorizationValueFactoryProvider.class).to(
ValueFactoryProvider.class).in(Singleton.class);

bind(SSOAuthorizationInjectionResolver.class).to(
new TypeLiteral<InjectionResolver<SSOAuthorization>>() {
}).in(Singleton.class);

}

}
}

然后在 ResourceConfig 中注册 Resolver

public class MyResourceConfig extends ResourceConfig {

public MyResourceConfig(Class... classes) {
super(classes);
register(new SSOAuthorizationResolver.Binder());
}
}

最后在带有 @SSOAuthorization 注释的 Controller 中使用它。

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public String someMethod(@SSOAuthorization String auth) {
return auth;
}

关于java - 将@Context参数传递给类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38598227/

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