使用FileInputStrem从Web应用程序读取.jks文件

时间:2013-02-20 00:30:54

标签: java java-ee tomcat web-applications

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

3 个答案:

答案 0 :(得分:2)

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

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

Thread.currentThread().getContextClassLoader()

并从那里加载资源,获得InputStream。换句话说 - 你现在正在做的事情。不要使用FileInputStream。除非你有充分的理由这样做,否则我会非常惊讶。

答案 1 :(得分:1)

访问未与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

这看起来很复杂但很多框架提供了通过Absoulute路径定位ResourceBundle文件等文件的选项。查看Spring的FileSystemResourceLoader的文档。

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

答案 2 :(得分:0)

如果您创建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));