作为WAR文件运行时,Sybase JDBC连接登录失败;但是在Eclipse中运行时登录成功

时间:2017-07-14 23:04:09

标签: spring jdbc sybase bouncycastle sybase-ase

我正在尝试从 Spring Boot 应用程序连接到 Sybase数据库

我正在使用 JConnect jconn4 jdbc驱动程序

Sybase服务器上的登录密码已加密,因此我使用 bouncycastle 加密API来加密密码。

以下是代码的

此代码使用普通JDBC 来测试连接,稍后我打算修改它以使用Spring的JDBCTemplate。

    Connection con = null;

    try {
        Class.forName("com.sybase.jdbc4.jdbc.SybDriver");
        logger.info("Loaded Sybase driver successfully.....");
    } catch (ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    }

    String url = "jdbc:sybase:Tds:<url>:<port>/<databasename>";
    Properties props = new Properties();
    props.put("ENCRYPT_PASSWORD", "true");
    props.put("JCE_PROVIDER_CLASS", "org.bouncycastle.jce.provider.BouncyCastleProvider");
    props.put("user", "username");
    props.put("password", "pwd");

    con = DriverManager.getConnection(url, props);

登录成功进入Sybase服务器:

  1. 在Eclipse IDE中运行应用程序。
  2. 登录SybaseServer时失败:

    1. Windows 命令提示符下运行生成的 WAR 文件。
    2. Linux 外壳(开发/ QA服务器)中运行生成的 WAR 文件。
    3. 我尝试了什么:

      1.比较应用程序在运行时下使用的jar文件的版本,用于以下jars。因为多个版本相同jar文件存在于 classpath (来自各种依赖项)。

      jconn4-7.07.jar(sybase jdbc驱动程序)。

      bcprov-jdk16-1.43.ja r(bouncycastle crypto API)。

      我使用下面的代码块来查找应用程序在运行时中使用的jar。

      Class clazz = null;
      try {
          clazz = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider");
          logger.info("BouncyCastleProvider is ... " + clazz.toString());
      
          if (clazz != null && clazz.getProtectionDomain() != null
                  && clazz.getProtectionDomain().getCodeSource() != null) {
              URL codeLocation = clazz.getProtectionDomain().getCodeSource().getLocation();
              logger.info("BouncyCastleProvider jar is ... " + codeLocation.toString());
          }
      
      } catch (ClassNotFoundException e) {
          logger.info(e.getMessage());
      }
      

      2.在eclipse中通过pom.xml的依赖 Hierarchy 窗口找到bcprov-jdk1x-x.xx.jar文件的 4个版本 '排除' pom中的三个文件。这是为了避免jar文件的版本 冲突

      但它不起作用: - (。

      为什么它能够在Eclispe中连接而不是在作为WAR运行时连接?

      任何帮助/方向都会非常有用。

1 个答案:

答案 0 :(得分:1)

经过大量的研究并花费了近10个小时的努力,我可以通过在连接中添加“ CHARSET ”来解决这个问题属性。

props.put("CHARSET", "iso_1");

故事的道德:问题可能更大但解决方案不是: - )。