Java 当用户密码中包含#字符时,红移JDBC连接无法通过身份验证

Java 当用户密码中包含#字符时,红移JDBC连接无法通过身份验证,java,jdbc,amazon-redshift,Java,Jdbc,Amazon Redshift,我遇到了一个与Redshift的JDBC连接问题,我无法完全解决这个问题。使用文档中给出的示例,当用户拥有普通密码时,我可以轻松连接到红移群集,但当用户拥有带有#字符的密码时,我会遇到身份验证失败。我能够使用两组凭据使用SQL Workbench/J连接到集群。当我使用以下工具时,没有连接问题 DriverManager.setLoginTimeout(60); Properties props = new Properties(); props.

我遇到了一个与Redshift的JDBC连接问题,我无法完全解决这个问题。使用文档中给出的示例,当用户拥有普通密码时,我可以轻松连接到红移群集,但当用户拥有带有#字符的密码时,我会遇到身份验证失败。我能够使用两组凭据使用SQL Workbench/J连接到集群。当我使用以下工具时,没有连接问题

        DriverManager.setLoginTimeout(60);
        Properties props = new Properties();
        props.setProperty("user", "johndoe");
        props.setProperty("password", "superSecret");
        props.setProperty("tcpKeepAlive", "true");

        Connection connection = DriverManager.getConnection("jdbc:redshift://xxxxxxx.us-east-1.redshift.amazonaws.com:5439/dev", props);
当我使用以下命令时

        DriverManager.setLoginTimeout(60);
        Properties props = new Properties();
        props.setProperty("user", "johndoehash");
        props.setProperty("password", "superDouble#Secret");
        props.setProperty("tcpKeepAlive", "true");

        Connection connection = DriverManager.getConnection("jdbc:redshift://xxxxxxx.us-east-1.redshift.amazonaws.com:5439/dev", props);
我得到了一个身份验证错误的消息

java.sql.SQLException: [Amazon](500310) Invalid operation: password authentication failed for user "johndoehash";
  at com.amazon.redshift.client.messages.inbound.ErrorResponse.toErrorException(ErrorResponse.java:1830)
  at com.amazon.redshift.client.InboundDataHandler.read(InboundDataHandler.java:454)
  at com.amazon.support.channels.AbstractSocketChannel.readCallback(Unknown Source)
  at com.amazon.support.channels.PlainSocketChannel.read(Unknown Source)
Caused by: com.amazon.support.exceptions.ErrorException: [Amazon](500310) Invalid operation: password authentication failed for user "johndoehash";

我可以使用SQL Workbench/J使用这两个帐户登录集群,但由于某些原因,我无法通过我的应用程序进行连接。有没有关于我做错了什么的想法?

我没有足够的观点来评论。我不知道这是否能解决你的问题。但是试试这个:

props.setProperty(“密码”、“超级双精度密码”)

在“&”和“#35”之间没有空格

或者


props.setProperty(“密码”、“超级双精度%23Secret”)

我没有足够的观点来评论。我不知道这是否能解决你的问题。但是试试这个:

props.setProperty(“密码”、“超级双精度密码”)

在“&”和“#35”之间没有空格

或者


props.setProperty(“密码”、“超级双精度%23Secret”)

这真的很奇怪,但是如果我在我的应用程序中使用一个已有一年历史的Java 8版本

java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

问题消失了。。。想想看。

这真的很奇怪,但是如果我在我的应用程序中使用了一年前的Java 8版本

java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

问题消失了。。。想想看。

你能试着给一个变量分配密码,然后在setproperty中传递密码吗?是的,我已经这样做了,得到了同样的结果。考虑到#在http中的使用可能会导致一些问题(??只是一个猜测),我已经尝试了URLEncoder.encode(密码,“UTF8”),但没有效果上的差异。很抱歉,我没有确切的解决方案,我不了解java,只是猜测一下,但不管有什么帮助,对吗?您是否尝试使用CHR(35)?您是否可以尝试将密码分配给一个变量,然后在setproperty中传递该密码。是的,我已经这样做了,并且得到了相同的结果。考虑到#在http中的使用可能会导致一些问题(??只是一个猜测),我已经尝试了URLEncoder.encode(密码,“UTF8”),但没有效果上的差异。很抱歉,我没有确切的解决方案,我不了解java,只是猜测一下,但不管有什么帮助,对吗?你试过使用CHR(35)吗?我试过对密码进行各种编码和转义,但没有任何效果。在百灵鸟上,我也试过你的,可悲的是,没什么区别。我开始怀疑这取决于驱动程序的依赖性。我将探讨我的应用程序与其他可以成功使用带有#的密码的应用程序之间依赖关系的差异。我尝试了各种密码编码和转义,但没有任何效果。在百灵鸟上,我也试过你的,可悲的是,没什么区别。我开始怀疑这取决于驱动程序的依赖性。我将探讨我的应用程序与其他可以成功使用#密码的应用程序之间依赖关系的差异。