Туннелирование Java RMI CGI в браузере
У меня есть программа Java RMI, которую я создал. У меня проблемы с подключением к серверу, если и только если я делаю это через туннелирование CGI и в браузере.
У меня были разные проблемы с этим, и я исправил большинство из них. Прежде всего, мой сервер является многодомным, поэтому мне пришлось установить свойство java.rmi.server.hostname. Во-вторых, в организации моего основного пользователя заблокированы порты, поэтому я должен настроить туннелирование CGI в java для прохождения через порт 80.
Теперь я могу из командной строки подключиться к серверу по туннелю (java -Dserver="xxx.xxx.xxx.xxx" -DproxyHost="xxx.xxx.xxx.xxx" kb360.desktop.MainPanel
) Однако, когда я запускаю его из браузера, соединение отказывается от хоста.
Кроме того, я могу запустить его из браузера, когда порты открыты. (т.е. нет необходимости туннелирования)
Я пробовал все виды вещей, чтобы найти решение. Я запустил сервер со следующими значениями свойств.
java -Djava.rmi.server.hostname=168.62.9.134 -Djava.rmi.server.logCalls=true -Djava.rmi.server.useCodebaseOnly=false -Djava.security.manager -Djava.security.policy=policy.txt kb360.service.Server
При попытке подключиться к нему в браузере и туннелировании ничего не регистрируется java.rmi.server.logCalls
, Однако в других случаях это так.
Это policy.txt
grant {
permission java.security.AllPermission;
};
Это вывод из консоли Java
Match: beginTraversal
Match: digest selected JREDesc: JREDesc[version 1.7+, heap=-1--1, args=null, href=http://java.sun.com/products/autodl/j2se, sel=false, null, null], JREInfo: JREInfo for index 0:
platform is: 1.7
product is: 1.7.0_21
location is: http://java.sun.com/products/autodl/j2se
path is: C:\Program Files\Java\jre7\bin\javaw.exe
args is:
native platform is: Windows, x86 [ x86, 32bit ]
JavaFX runtime is: JavaFX 2.2.21 found at C:\Program Files\Java\jre7\
enabled is: true
registered is: true
system is: true
Match: ignoring maxHeap: -1
Match: ignoring InitHeap: -1
Match: digesting vmargs: null
Match: digested vmargs: [JVMParameters: isSecure: true, args: ]
Match: JVM args after accumulation: [JVMParameters: isSecure: true, args: ]
Match: digest LaunchDesc: http://x.x.x.x/kb.jnlp
Match: digest properties: []
Match: JVM args: [JVMParameters: isSecure: true, args: ]
Match: endTraversal ..
Match: JVM args final:
Match: Running JREInfo Version match: 1.7.0.21 == 1.7.0.21
Match: Running JVM args match: have:<> satisfy want:<>
Registry RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[x.x.x.x:1099](remote),objID:[0:0:0, 0]]]]
java.rmi.ConnectException: Connection refused to host: x.x.x.x; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at kb360.desktop.Client.<init>(Client.java:27)
at kb360.desktop.MainPanel.initialize(MainPanel.java:94)
at kb360.desktop.MainPanel.start(MainPanel.java:140)
at com.sun.javafx.applet.FXApplet2$1.run(FXApplet2.java:132)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.proxy.RMIMasterSocketFactory.checkConnector(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 17 more
Это соответствующий код на стороне клиента
Фрагмент MainPanel.java (точка входа на стороне клиента)
//gets the proxyHost and my own server properties
findProperties();
System.setProperty("java.rmi.server.useCodebaseOnly","false");
//I don't know if I have this set right. But I guess it doesn't matter
// because of setting the SecurityManager below.
System.setProperty("java.security.debug","failure,access");
//I know I am going overboard. But I wanted to make sure
// security wasn't a problem
System.setSecurityManager(
new SecurityManager()
{
@Override
public void checkAccept(String host, int port)
{
}
@Override
public void checkAccess(Thread t)
{
}
@Override
public void checkAccess(ThreadGroup g)
{
}
@Override
public void checkConnect(String host, int port)
{
}
@Override
public void checkConnect(String host, int port, Object context)
{
}
public void checkPermission(Permission perm)
{
}
}
);
//This is set properly from the command line and from the browser
System.out.println("server " + System.getProperty("server") + " proxyHost " + System.getProperty("proxyHost") );
/*line 94*/ client = new Client(System.getProperty("server"));
Фрагмент Client.java
try
{
//I changed the lookupName from "sever" to this.
//I don't think it made any difference
String lookupName = "rmi://x.x.x.x:1099/server";
Registry registry = LocateRegistry.getRegistry(serverName);
System.out.println("Registry " + registry);
/*line 27*/ mRemotes = (ServerRemotes) registry.lookup(lookupName);
boolean ready = true;
if (mRemotes == null)
{
ready = false;
System.out.println("remote is null");
}
if ( (mUploader = mRemotes.getUploadRemote()) == null)
{
ready = false;
System.out.println("upload is null");
}
if ( (mSearcher = mRemotes.getSearchRemote()) == null)
{
ready = false;
System.out.println("search is null");
}
System.out.println(mRemotes);
System.out.println(mUploader);
System.out.println(mSearcher);
System.setProperty("proxyHost","localhost");
}
catch (RemoteException re)
{
re.printStackTrace();
mRemotes = null;
}
catch (Exception e)
{
System.err.println("Client exception:");
e.printStackTrace();
}
Баночка манифеста лично подписана.
Manifest-Version: 1.0
Permissions: all-permissions
Created-By: 1.7.0_13 (Oracle Corporation)
Codebase: *
...
...
Однако jnlp не подписан. Я не думаю, что это имеет значение, хотя. Приложение javafx запрашивает все разрешения на запуск в соответствии с файлом jnlp. Моя программа может запускаться только без подключения к серверу.
Jnlp имеет все права доступа
<security>
<all-permissions/>
</security>
Фрагмент HTML-файла. Должно ли быть что-то о разрешениях
var parameters = {
id:"kb360",
width:screen.width,
url:"kb360.jnlp",
height:screen.height,
placeholder:"placeholder"
};
var app = new dtjava.App("www.myWebsite.com/kb.jnlp",parameters);
var platform = new dtjava.Platform({
javafx: "2+",
jvm:"1.7+"
});
alert (platform);
dtjava.embed(app,platform);
}
dtjava.addOnloadCallback(deployKB);