我正在尝试从applet上传文件(日志文件),在浏览器中运行。我正在使用String读取文件。在函数之后,给定字符串数据和字符串URL(例如:http://192.168.0.166:8380/app/customer/UploadData.do),将数据上载到URL。因为超时后,与服务器的会话丢失。因此,我附加了URL的用户名和密码,以避免任何会话过期问题(因为这个上传应该是自动的,没有任何手动输入等)。 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
}
}
只要与服务器的会话处于活动状态,此功能就可以正常工作。例如,当会话过期或用户注销(applet 24/7运行)时,它不起作用。请注意,通过Web浏览器访问上述URL工作正常。它的这个java代码(applet)在会话到期时无法再次连接。如果有人能指出我在这里做错了什么,那将是非常有帮助的。任何帮助将受到高度赞赏。
环境: Jboss作为应用服务器,JBoss Secured Realm用于登录。
答案 0 :(得分:1)
您要查询的网页是否接受登录并根据您发送的用户名/密码参数创建新会话?
如果用户通过标准方法登录网站(例如,他们在浏览器中输入详细信息的登录页面),则会创建一个来回发送的cookie,将其识别为“所有者”该会话并验证它们(直到它超时)。如果他们然后运行您的小程序,那么您的小程序将最终捎带该会话和cookie,直到它过期。
如果它过期,你的applet将需要做同样的事情,用户登录,最有可能对登录页面进行HTTP POST,除非上传页面明确接受用户名和密码,不需要会话或创建一个然后你正在尝试的东西将无法工作。
您可以查看表单的登录页面,让applet查询该页面,解析cookie的输出HTTP标头并将其传回上传。
如果没有一个简单的解决方案可能是让您的applet只是定期查询网站(每小时或每20分钟一次),以防止会话超时。它不一定需要上传 - 它可以查询任何受限制的页面。
答案 1 :(得分:1)
问题出在您的服务器实现中,而不是客户端代码中。当客户端程序连接到服务器时,不应使用会话来标识用户。在Web浏览器上下文中使用会话更为合适。
从cilent程序连接到服务器时,应使用Basic Authentication方法。这可以通过在上传请求中添加Authorization
标头来完成,服务器会解析此标识以获取用户名和密码。它比在您的网址中输入用户名和密码稍微安全一些。还有其他身份验证方法,您可能需要查看。
答案 2 :(得分:0)
HttpClient可能会有所帮助:HTTP PUT。