java - 使用 jax-rs 和 cxf 进行客户端身份验证

标签 java jersey cxf jax-rs

我们打算将 JAX-RS 实现从 Jersey 切换到 Apache CXF 3.0。我只是想不通基本身份验证是如何通过 Apache CXF 方式完成的。我在 CXF WebClient 周围找到的所有示例,而不是 JAX-RS Client API。

这就是 Jersey 的作用:

Client client = ClientBuilder.newClient();
client.register(HttpAuthenticationFeature.basic(config.getUsername(),config.getPassword()));

Apache CXF 如何做到这一点?

最佳答案

创建一个 ClientRequestFilter执行基本身份验证:

@Provider
public class Authenticator implements ClientRequestFilter {

    private String user;
    private String password;

    public Authenticator(String user, String password) {
        this.user = user;
        this.password = password;
    }

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        requestContext.getHeaders().add(
            HttpHeaders.AUTHORIZATION, getBasicAuthentication());
    }

    private String getBasicAuthentication() {
        String userAndPassword = this.user + ":" + this.password;
        byte[] userAndPasswordBytes = userAndPassword.getBytes("UTF-8");
        return "Basic " + Base64.getEncoder().encodeToString(userAndPasswordBytes);
    }
}

并在你的 Client 中注册它:

Client client = ClientBuilder.newClient().register(new Authenticator(user, password));

上述解决方案使用 Java 8 Base64.Encoder执行 Base64 编码。
如果出于某种原因,您没有使用 Java 8,则可以使用 BaseEncoding来自 Google Guava .

关于java - 使用 jax-rs 和 cxf 进行客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25155017/

相关文章:

Java-8 - 从 Optional.of(String) 的开头替换 "?"字符

java - Nexus 模拟器屏幕不显示 maven android :deploy result

java - ReSTLet - 客户端的入门内容 - 路径、接受 header 、查询参数

java - 如何将通用文件发送到 Jersey 服务并正确接收?

java - 无法编码 java.lang.String

java - Respond.getRequestDispatcher() 不起作用

java - 本地开发环境和云之间的 Google App Engine 行为有何不同?

java - CXF生成的客户端HandlerTubeFactory没有实现TubeFactory

cxf - 如何使用蓝图配置 CXF JAX-WS 服务器

java - 透明 PNG 在 LWJGL 中不透明