【问题标题】:Reading .jks file from web application using FileInputStream使用 FileInputStream 从 Web 应用程序中读取 .jks 文件
【发布时间】:2013-02-04 21:18:13
【问题描述】:

如何从使用 Tomcat 服务器部署的 REST Web 应用程序中读取 .jks 文件?我正在使用FileInputStream 来读取文件。我目前在处理用于在 Web 应用程序中读取文件的相对路径时遇到了困难。我知道该文件将在WEB-INF/classes 下。使用FileInputStream 读取文件的最佳方式是什么?我知道使用classLoader。但随后它返回InputStream

【问题讨论】:

    标签: java jakarta-ee tomcat web-applications


    【解决方案1】:

    如果您创建了 KeyStore(无密码和默认类型)

    InputStream is = this.getClass().getClassLoader().getResourceAsStream("jskFileName"); 
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(is, null);
    

    但是 FileInputStream 真的很好,如果你...

    使用集群服务器时请注意。

    例如

    /contextPath
        /WEB-INF
        /pathA/
           /sample.jks
    
    ServletContext sc
    String path="/pathA/sample.jks";
    String realPath = sc.getRealPath(path);
    FileInputStream fis = new FileInputStream(new File(realPath));
    

    【讨论】:

    • 这里的重点是 Tomcat 的默认类加载器配置将 WEB-INF/classes 放在靠近优先级列表顶部的位置(参见 tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html)。 getResourceAsStream() 用于在类路径中定位文件。后一个示例显示了如何加载不在类路径中的文件,包括WEB-INF/classes。 @user1428716 有一个很好的观点,即最好允许在代码之外配置路径。
    【解决方案2】:

    使用直接文件访问 (FileInputStream) 来读取与应用程序捆绑的资源是一种不好的做法;原因是它会导致您遇到的那种问题。在托管运行时环境中,开发人员几乎无法控制资源实际所在的路径。

    对于基于 servlet 的应用程序(您正在使用,正如您提到您正在使用 Tomcat),最好的方法是使用上下文类加载器:

    Thread.currentThread().getContextClassLoader()

    并从那里加载资源,得到一个InputStream。换句话说-您目前正在正确地做事。不要使用FileInputStream。除非您有绝对充分的理由这样做,否则我会感到非常惊讶。

    【讨论】:

      【解决方案3】:

      访问未与 EAR / WAR 捆绑的文件的最佳方法是使用 java.util.Properties。我确信像 jks 文件这样的文件永远不会与 EAR 捆绑在一起,它们位于服务器或服务器目录( weblogic 、 websphere )的域文件夹中。属性文件应放置在独立于服务器安装目录的文件位置。

      这是我能想到的解决方案:

      1. Initialize a Servlet with init-param in web.xml
      2. The init-param can be the absolute file location  
         <param-name>porperies-file</param-name>
         <param-value>/usr/properties/abc.jks</param-value>
      3. In the static block of the Servlet , load the properties file / jks 
         file and store it    in parameter
      

      这看起来很复杂,但许多框架提供了通过绝对路径定位文件(如 ResourceBundle 文件)的选项。查看 Spring 的 FileSystemResourceLoader 的文档。

      这样一个过程的好处是,如果“jks”文件发生变化,你只需要启动服务器。如果您在 EAR 中有属性文件,则需要部署应用程序,然后重新启动服务器。考虑到这一点,您可以有逻辑来检查文件的新鲜度。在这种情况下,系统根本不需要重新启动,但您必须添加额外的同步逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多