Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 访问WEB-INF之外的文件_Java_Linux_Ubuntu_Tomcat_Servlets - Fatal编程技术网

Java 访问WEB-INF之外的文件

Java 访问WEB-INF之外的文件,java,linux,ubuntu,tomcat,servlets,Java,Linux,Ubuntu,Tomcat,Servlets,我将在Linux服务器(Ubuntu16.04)上的web服务器上使用servlet中的库 我需要从servlet读取文件。servlet中的代码是: Credentials credentials = null; String password = "secretPassword"; String pathToWalletFile = "/home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.23

我将在Linux服务器(Ubuntu16.04)上的web服务器上使用servlet中的库

我需要从servlet读取文件。servlet中的代码是:

    Credentials credentials = null;
    String password = "secretPassword";
    String pathToWalletFile = "/home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00";
    File file = new File(pathToWalletFile);

    try {
        credentials = WalletUtils.loadCredentials(
                password,
                file
        );
    } catch (CipherException e) {
        e.printStackTrace();
    }
该文件具有以下权限:644(-rw-r--r--)Tomcat8,在Ubuntu 16.04上使用“sudo apt install Tomcat8”以默认设置安装(用户:Tomcat8)

如果调用servlet,则会出现以下错误:

HTTP Status 500 - /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00 (Permission denied)

type Exception report

message /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00 (Permission denied)

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.io.FileNotFoundException: /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00 (Permission denied)
java.io.FileInputStream.open0(Native Method)
java.io.FileInputStream.open(FileInputStream.java:195)
java.io.FileInputStream.<init>(FileInputStream.java:138)
com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:756)
com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2740)
org.web3j.crypto.WalletUtils.loadCredentials(WalletUtils.java:76)
net.cryptonomica.tomcatweb3j.TestServlet.doGet(TestServlet.java:75)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

note The full stack trace of the root cause is available in the Apache Tomcat/8.0.32 (Ubuntu) logs.

Apache Tomcat/8.0.32 (Ubuntu)
返回:

ls: cannot access '/home/ubuntu/.ethereum/testnet/': Permission denied 
即使我将“tomcat8”用户添加到“ubuntu”组

$members ubuntu 
现在返回:

ubuntu tomcat8

返回:

ubuntu tomcat8
total 8 
drwxr--r-- 5 ubuntu ubuntu 4096 Jun 17 17:33 geth 
srw------- 1 ubuntu ubuntu 0 Jun 18 14:08 geth.ipc 
drwxr--r-- 2 ubuntu ubuntu 4096 Jun 18 03:11 keystore 
但是tomcat8仍然没有对/home/ubuntu/.ethereum/testnet/的读取权限


将文件移动到另一个目录(用户“tomcat8”可以访问该目录)可以解决这个问题。但我还是不明白问题出在哪里。一般来说,我希望从servlet读取文件/home/ubuntu/.ethereum/testnet/,检查路径中所有目录的权限

特别要检查
/home/ubuntu/

尝试此操作以检查文件是否可读

File f = new File("/home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00");

if (f.canRead()) {
  System.out.println("is Readable");
}

检查路径中所有目录的权限

特别要检查
/home/ubuntu/

尝试此操作以检查文件是否可读

File f = new File("/home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00");

if (f.canRead()) {
  System.out.println("is Readable");
}

这是一个基本的权限问题

看起来好像这个文件在
ubuntu
用户的主目录下。在这种情况下,更改权限是个坏主意。更好的选择是将这些文件的存储移到任何特定用户的主目录之外,或者更好地将它们移到tomcat用户的主目录(如果该目录仅用于服务器管理的内容)

否则,您需要做的是找出tomcat进程作为哪个用户运行,然后相应地授予权限:

sudo chown tomcat:tomcat /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00
#OR
sudo chmod a+r /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00
#OR grant folder access if files are dynamically generated
sudo chmod -R a+r /home/ubuntu/.ethereum/testnet/keystore/

上面的代码假设运行tomcat的用户名为
tomcat

这是一个基本的权限问题

看起来好像这个文件在
ubuntu
用户的主目录下。在这种情况下,更改权限是个坏主意。更好的选择是将这些文件的存储移到任何特定用户的主目录之外,或者更好地将它们移到tomcat用户的主目录(如果该目录仅用于服务器管理的内容)

否则,您需要做的是找出tomcat进程作为哪个用户运行,然后相应地授予权限:

sudo chown tomcat:tomcat /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00
#OR
sudo chmod a+r /home/ubuntu/.ethereum/testnet/keystore/UTC--2017-06-18T03-11-13.235052023Z--6c992fb9531c9285ca9aba80c32a63074b0acd00
#OR grant folder access if files are dynamically generated
sudo chmod -R a+r /home/ubuntu/.ethereum/testnet/keystore/
以上代码假设运行tomcat的用户名为
tomcat