Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用FileInputStream从web应用程序读取.jks文件_Java_Jakarta Ee_Tomcat_Web Applications - Fatal编程技术网

Java 使用FileInputStream从web应用程序读取.jks文件

Java 使用FileInputStream从web应用程序读取.jks文件,java,jakarta-ee,tomcat,web-applications,Java,Jakarta Ee,Tomcat,Web Applications,如何从部署了Tomcat服务器的rest web应用程序中读取.jks文件?我正在使用FileInputStream读取文件。我目前在处理web应用程序中用于读取文件的相对路径时遇到困难。我知道该文件将位于WEB-INF/classes下。使用FileInputStream读取文件的最佳方式是什么。我知道如何使用classLoader。但是如果您创建了密钥库(没有密码和defaultType),那么它将返回InputStream 但是如果你 请注意,当您使用群集服务器时 比如说 /context

如何从部署了Tomcat服务器的rest web应用程序中读取
.jks
文件?我正在使用
FileInputStream
读取文件。我目前在处理web应用程序中用于读取文件的相对路径时遇到困难。我知道该文件将位于
WEB-INF/classes
下。使用
FileInputStream
读取文件的最佳方式是什么。我知道如何使用
classLoader
。但是如果您创建了密钥库(没有密码和defaultType),那么它将返回
InputStream

但是如果你

请注意,当您使用群集服务器时

比如说

/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));

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

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

Thread.currentThread().getContextClassLoader()


然后从那里加载资源,得到一个
InputStream
。换句话说,你现在做的事情是正确的。不要使用
FileInputStream
。除非你有绝对充分的理由这样做,否则我会非常惊讶。

访问未与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
1。在web.xml中使用init param初始化Servlet
2.init参数可以是文件的绝对位置
porperies锉刀
/usr/properties/abc.jks
3.在Servlet的静态块中,加载属性文件/jks
文件并将其存储在参数中
这看起来很复杂,但许多框架提供了通过绝对路径定位文件(如ResourceBundle文件)的选项。检查Spring的FileSystemResourceLoader的文档


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

这里的要点是,Tomcat的默认类加载器配置将
WEB-INF/classes
放在优先级列表的顶部(请参阅)<代码>getResourceAsStream()用于在类路径中定位文件。后一个示例显示如何加载不在类路径中的文件,包括
WEB-INF/classes
@user1428716有一个很好的观点,即最好允许在代码之外配置路径。
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