我正在尝试从在浏览器中运行的小程序上传文件(日志文件)。我正在读取字符串中的文件。以下函数,给定一个字符串数据和一个字符串 URL(例如:http://192.168.0.166:8380/app/customer/UploadData.do),将数据上传到一个 URL。因为在超时后,与服务器的 session 丢失。因此,我在 URL 中附加了用户名和密码,以避免任何 session 过期问题(因为此上传应该是自动的,无需任何手动输入等)。 URL(非公开)类似于:
http://192.168.0.166:8380/app/customer/UploadData.do?username=uname&password=pword
public static void sendData(String aData, String aURL) throws Exception {
try {
byte[] myData = aData.getBytes();
/* Uploading the data */
URL myURL = new URL(aURL);
HttpURLConnection myConnection = (HttpURLConnection) myURL.openConnection();
myConnection.setDoOutput(true);
myConnection.setUseCaches(false);
myConnection.setDefaultUseCaches(false);
myConnection.setRequestProperty("Content-type", "application/octet-stream");
OutputStream myOutputStream = myConnection.getOutputStream();
myOutputStream.write(myData);
myOutputStream.flush();
myOutputStream.close();
int status = ((HttpURLConnection) myConnection).getResponseCode();
} catch (Exception exception) {
throw exception
}
}
只要与服务器的 session 处于 Activity 状态,此功能就绝对可以正常工作。它在例如 session 过期或用户注销时不起作用(小程序全天候运行 24/7)。请注意,当通过网络浏览器访问时,上述 URL 工作正常。它是这个 java 代码(小程序),当 session 过期时无法再次连接。如果有人能指出我在这里做错了什么,那将很有帮助。任何帮助将不胜感激。
环境:Jboss 作为应用程序服务器,JBoss Secured Realm 用于登录。
最佳答案
您正在查询的网页是否接受登录并根据您发送的用户名/密码参数创建新 session ?
如果用户通过标准方法登录网站(例如,他们在浏览器中输入详细信息的登录页面),那么这将创建一个 cookie,该 cookie 来回发送,将他们标识为网站的“所有者”该 session 并对它们进行身份验证(直到超时)。如果他们随后运行您的小程序,那么您的小程序将最终搭载该 session 和 cookie,直到它过期。
如果它确实过期,您的小程序将需要做与用户登录时所做的相同的事情,很可能对登录页面执行 HTTP POST,除非上传页面明确接受用户名和密码并且不需要 session 或创建一个那么你正在尝试的将不起作用。
不过,您可以查看表单的登录页面,让您的小程序查询该页面,解析 cookie 的输出 HTTP header ,然后在上传时将其传回。
如果做不到这一点,一个简单的解决方案可能是让您的小程序定期(每小时或 20 分钟一次)简单地查询网站以防止 session 超时。它不一定需要上传 - 它可能可以查询任何受限页面。
关于java - 使用 HTTP 连接从 Java 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8309008/