有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Restlet请求对象不包含身份验证信息

我使用的代码库有两个版本:第一个(旧的)版本使用v1。0.0版本,后者(较新)版本使用v2。2.2.

当用户使用cURL查询两个版本的my service,并将其用户名和密码作为base64编码的String提供时,它就起作用了。类似地,两个版本都接受Authorization: Basic ...头中编码的String

它们的不同之处在于,当我尝试使用HttpURLConnection调用服务时。前者有效,后者无效

以下是调用我的服务的工具的工作原理:

final String xx_userid = userid; // userid set above
final String xx_pwd = pwd;       // pwd set above
Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(
                xx_userid, xx_pwd.toCharArray());
    }
});

// ... some more code ...

URL url = new URL(url_string); // url_string is the endpoint of my service
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Accept", "text/xml");

上面的代码适用于较旧的代码库(也就是说,我得到了一个200 OK以及预期的XML响应)。然而,对于新的代码库,我得到了一个403 Unauthorized

下面是我的新代码库中的代码片段,它应该从请求中获取用户名和密码:

@Override
protected boolean authenticate (Request request, Response response) {

    String user = null;
    String pass = null;

    user = request.getChallengeResponse().getIdentifier();
    pass = new String(request.getChallengeResponse().getSecret());

    // ... some more code ...

}

userpass最后都停留在null,因为getChallengeResponse()方法返回null

有人知道为什么这段代码适用于v1吗。0.0版本,但不适用于v2。2.2? 还是我还遗漏了什么

其他一些(可能不相关)信息:

  • 旧代码库:
    • 正在Tomcat v7中运行。0.55
    • 托管在RHEL7计算机上
    • 没有负载平衡器
  • 新的代码库:
    • 正在Tomcat v7中运行。0.55
    • 托管在EC2实例(Amazon Linux AMI)上
    • 使用Amazon的应用程序负载平衡器(ALB)指向不同的EC2实例
    • 负载平衡器的域名与服务实例的域名不同

提前谢谢。请让我知道,如果有任何更多的信息,我可以提供,使这更容易调试


共 (0) 个答案