Я использую jxbrowser 5.2 в моем java апплете.
У меня есть метод, который возвращает BrowserContext
protected BrowserContext initChromiumContext()
{
String binariesPath = ContextTool.getInstance().getGeneralProperty("JXBROWSER_CHROMIUM_DIR");
String chromium_switch = ContextTool.getInstance().getGeneralProperty("JXBROWSER_CHROMIUM_SWITCH");
String cache_path="";
String galileoLang=ContextTool.getInstance().getContextData("LANGUAGE").toLowerCase();
BrowserContext context;
String OS = System.getProperty("os.name");
//BrowserPreferences.setChromiumSwitches("--lang="+galileoLang, "--disable-gpu"); //--disable-gpu --disable-gpu-compositing
BrowserPreferences.setChromiumSwitches(chromium_switch);
if(binariesPath!=null && (binariesPath.equals("JAVA_CACHE") || binariesPath.equals("JAVA_CACHE_STRICT")
|| binariesPath.equals("JAVA_CACHE_DISK") ||binariesPath.equals("OS_RELATIVE")
))
{
String javaCacheDirStr = com.sun.deploy.config.Config.getCacheDirectory();
try{
File javaCacheDir = new File(javaCacheDirStr);
if(javaCacheDir.exists() && javaCacheDir.isDirectory() )
{
File parentDir = null;
if(binariesPath.equals("JAVA_CACHE_STRICT") || (binariesPath.equals("OS_RELATIVE")&&OS.toUpperCase().contains("XP") ))
{
parentDir = javaCacheDir;
}
if(binariesPath.equals("JAVA_CACHE"))
{
parentDir = javaCacheDir.getParentFile();
}
if(binariesPath.equals("JAVA_CACHE_DISK"))
{
//parentDir = javaCacheDir.getAbsolutePath().re;
File[] roots = javaCacheDir.listRoots();
parentDir = roots[0];
}
if(binariesPath.equals("OS_RELATIVE") && !OS.toUpperCase().contains("XP"))
{
String appo_chrome_temp=System.getenv("CHROMIUMTEMP");
if (appo_chrome_temp ==null)
appo_chrome_temp=System.getenv("temp");
parentDir=new File(appo_chrome_temp);
}
File chromiumDir = new File(parentDir,"jxbrowser-chromium-"+ChromiumBuild.version());
if(!chromiumDir.exists())
{
chromiumDir.mkdirs();
}
if(chromiumDir.canWrite())
{
cache_path=chromiumDir.getAbsolutePath();
}
else throw new IOException("Cannot write in "+chromiumDir+ " folder. Default chromium dir will be used");
}
}catch(Exception e)
{
logger.error("Error creating chromium dir in java cache directory", e);
}
}
else if(binariesPath!=null && binariesPath.trim().length()>0)
{
binariesPath = binariesPath.trim();
try{
File chromiumDir = new File(binariesPath,"jxbrowser-chromium-"+ChromiumBuild.version());
if(!chromiumDir.exists())
{
chromiumDir.mkdirs();
}
if(chromiumDir.canWrite())
{
cache_path=chromiumDir.getAbsolutePath();
}
else throw new IOException("Cannot write in "+chromiumDir+ " folder. Default chromium dir will be used");
}catch(Exception e)
{
logger.error("Error creating chromium dir in " + binariesPath, e);
}
}
logger.debug("[JxBrowserComponent.BrowserContext] language: "+galileoLang +" cachePath: " +cache_path);
if (cache_path.equals(""))
{
logger.debug("[JxBrowserComponent.BrowserContext] Default Location");
context = new BrowserContext(BrowserPreferences.getDefaultDataDir(),galileoLang);
}
else
{
logger.debug("[JxBrowserComponent.BrowserContext] altered location");
BrowserPreferences.setChromiumDir(cache_path);
context = new BrowserContext(cache_path+"/data",galileoLang);
}
NetworkService NS = new NetworkService(new IPC(null,null) ,context.getIdentifier() );
context.getNetworkService().setNetworkDelegate(new DefaultNetworkDelegate() {
@Override
public void onBeforeSendHeaders(BeforeSendHeadersParams params) {
HttpHeaders headers = params.getHeaders();
logger.debug("###PARAM GET METHOD### "+ params.getMethod() );
logger.debug("###PARAM GET URL### "+ params.getURL() );
if (params.getMethod().equals("POST") &&
( params.getURL().equals("https://portaleoperatore.azero.veneto.it/LoginOperatori/consensi-paziente") ||
params.getURL().equals("https://portaleoperatore-test.azero.veneto.it/LoginOperatori/consensi-paziente")
) )
{
logger.debug("###MODIFICO HEADER###" );
params.getHeaders().setHeader("Content-Type", "application/json");
}
}
});
return context;
}
Апплет создает элемент браузера каждый раз, когда я открываю панель Swing. Когда я закрываю панель, я запускаю метод dispose на моем экземпляре Browser.
Если я открываю панель Swing во второй раз, я получаю следующую ошибку
ehealth.fgForm - [FgClassLoader. loadClassData] Класс формы, загруженный с сервера: de.gm dnet .webmed.fg.generated.SOLINFO.Panelgraphic_button_bar network: Connessione a http://netgalileotst02.sanita.padova.it: 9080 / webmed / SCart / SFgClassReader con proxy = DIRECT 2020 -03-11 23: 50: 58,247 DEBUG ehealth.fgForm - [FgClassLoader.loadClassData] кэшированный класс: de.gm dnet .webmed.fg.generated.SOLINFO.Panelgraphic_button_bar обновлен, изменен на сервере: 29 июля 2016 14.36.16 CEST local Дата: 29 июля 2016 г. 14.36.16 CEST 2020-03-11 23: 50: 58 263 DEBUG ehealth.fgForm - [JxBrowserComponent.init] os.name значение свойства = Windows 2003 2020-03-11 23 : 50: 58,263 DEBUG ehealth.fgForm - язык [JxBrowserComponent.BrowserContext]: it cachePath: 2020-03-11 23: 50: 58,263 DEBUG ehealth.fgForm - [JxBrowserComponent.BrowserContext] Местоположение по умолчанию 11:50:58 ИНФОРМАЦИЯ: имя ОС Windows 2003 11:50:58 ИНФОРМАЦИЯ: версия JRE: 1.6.0_18-b07 32-разрядная 11:50:58 ИНФОРМАЦИЯ: версия JxBrowser: 5.2 2020-03-11 23: 50: 58,263 ОШИБКА ehealth.fgForm - [PanelJxBrowser. PanelJxBrowser] java .lang.IllegalStateException: канал уже закрыт. на com.teamdev.jxbrowser.chromium.internal.ip c .SocketChannelWriter.write (неизвестный источник) на com.teamdev.jxbrowser.chromium.internal.ip c .SocketChannel.send (неизвестный источник) на com.teamdev .jxbrowser.chromium.NetworkService.a (Unknown Source) на com.teamdev.jxbrowser.chromium.NetworkService.setNetworkDelegate (Unknown Source) в de.gm dnet .webmed.fg.elements.custom.JxBrowserComponent.initChromiumContext (JxBrowserComponent. java: 315) в de.gm dnet .webmed.fg.elements.custom.JxBrowserComponent. (JxBrowserComponent. java: 133) в de.gm dnet .webmed.fg.elements.PanelJxBrowser. ( PanelJxBrowser. java: 89) на de.gm dnet .webmed.fg.generated.SOLINFO.Paneljxb_panel.addChild1 (Paneljxb_panel. java: 94) на de.gm dnet .webmed.fg.generated. SOLINFO.Paneljxb_panel. (Paneljxb_panel. java: 57) на de.gm dnet .webmed.fg.generated.SOLINFO.Formmedication. (Formmedication. java: 3
Я замечаю что если я удалю из кода часть, относящуюся к onBeforeSendHeaders
> context.getNetworkService().setNetworkDelegate(new
> DefaultNetworkDelegate() {
>
> @Override
> public void onBeforeSendHeaders(BeforeSendHeadersParams params) {
>
> ... .... ... })
проблема не возникает ...
...
Но я нуждаюсь в этом, потому что мне нужно переписать некоторые http-параметры