I have the following scenario for a customer of mine:
He has a hosted server (1) (i.e. http://customer.net) which basically redirects to an address in this format: http:///app (server 2)
The IP address changes frequentl开发者_如何学JAVAy (they told me even each two weeks). There's an application in server 2 with a jnlp link which obviously is configured to download from server 2 IP. When the IP of server 2 changes the jnlp will be broken.
For me the obvious option is to obtain a dedicated IP address with the provider, but wanted to know if there are any other options.
Thanks in advance!
I was able to figure it out. Basically I have a servlet from which the jnlp link is triggered. I gather the correct URL from the request and update the jnlp file with it before download. Also I added some temp files to avoid doing that all the time, only when the URL changes.
Here's the related code:
File jnlp = null;
File backup = null;
String protocol = "http://";
String url = request.getRequestURL().toString();
url = url.substring(url.indexOf(protocol) + protocol.length(), url.indexOf("/xinco/menu.jsp"));
File last = new File(getServletContext().getRealPath("/client/" + url + ".xinco"));
if (!last.exists()) {
File dir = new File(getServletContext().getRealPath("/client/"));
String[] list = dir.list(new ExtensionFilter(".xinco"));
if (list.length != 0) {
for (int i = 0; i < list.length; i++) {
new File(dir.getAbsolutePath(), list[i]).delete();
}
}
try {
jnlp = new File(getServletContext().getRealPath("/client/XincoExplorer.jnlp"));
backup = new File(getServletContext().getRealPath("/client/XincoExplorer.jnlp.bak"));
backup.createNewFile();
if (jnlp.exists()) {
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(jnlp).getChannel();
destination = new FileOutputStream(backup).getChannel();
destination.transferFrom(source, 0, source.size());
} finally {
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}
}
try {
StringBuilder contents = new StringBuilder();
//use buffering, reading one line at a time
//FileReader always assumes default encoding is OK!
BufferedReader input = new BufferedReader(new FileReader(jnlp));
try {
String line = null; //not declared within while loop
/*
* readLine is a bit quirky :
* it returns the content of a line MINUS the newline.
* it returns null only for the END of the stream.
* it returns an empty String if two newlines appear in a row.
*/
while ((line = input.readLine()) != null) {
if (line.contains("codebase") && !line.startsWith("<!")) {
String start = line.substring(0,
line.indexOf(protocol) + protocol.length());
String end = null;
end = line.substring(line.indexOf("/xinco"));
line = start + url + end;
}
contents.append(line);
contents.append(System.getProperty("line.separator"));
}
//use buffering to update jnlp
Writer output = new BufferedWriter(new FileWriter(jnlp));
try {
//FileWriter always assumes default encoding is OK!
output.write(contents.toString());
} finally {
output.close();
}
} finally {
input.close();
backup.delete();
last.createNewFile();
}
} catch (IOException ex) {
try {
source = new FileInputStream(backup).getChannel();
destination = new FileOutputStream(jnlp).getChannel();
destination.transferFrom(source, 0, source.size());
backup.delete();
} finally {
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}
}
}
} else {
throw new XincoException("Missing XincoExplorer.jnlp!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
精彩评论