Italian B4j Webview ( Client does not have access to the resource on the server )

Xfood

Active Member
Licensed User
Buongiorno A tutti,
volevo creare una semplice procedura in b4j con WebViev,
in pratica devo mettere un indirizzo ip e fare un loadurl per vedere la pagina di ritorno,
solo che " la bilancia in questo caso" mi da ( Client does not have access to the resource on the server )
normalmente la utilizzo con internet explorer per fare teleassistenza direttamente sulla bilancia, la bilancia in questo caso ha dentro un serverino java che ci permette di gestirla,
come posso fare in b4j un piccolo webview? cosi da evitare internet explore..
allego il mio codice.
P.s. se metto url di libero.it per esempio mi apre la pagina e mi fa navigare senza problemi

esempio:
Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    Private xui As XUI
    Private Button1 As B4XView
    Private WebView1 As WebView
    Private TextField1 As B4XView
    Private Button2 As B4XView
    Public we, tp As JavaObject
    Private Button3 As B4XView
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1")
    MainForm.Show

    ' errore che mi ritorna il device'
    ' Client does not have access to the resource on the server
    Dim jo As JavaObject = Me
    jo.RunMethod("disableSSLTest", Null)
  
    WebView1.Enabled = True
    WebView1.Visible = True
  
    we.InitializeNewInstance("javafx.scene.web.WebEngine",Null)
    '
    tp = WebView1
    we = tp.RunMethod("getEngine",Null)
End Sub

Sub Button1_Click
    WebView1.LoadUrl(TextField1.Text.Trim)
End Sub

Sub Button2_Click
    we.RunMethod("executeScript",Array As Object("history.back()"))
End Sub

Sub Button3_Click
    we.RunMethod("executeScript",Array As Object("history.forward()"))
End Sub

#if JAVA
import java.security.GeneralSecurityException;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;

public static void disableSSLTest() {
     TrustManager[] trustAllCerts = new TrustManager[] {
         new X509TrustManager() { 
           public java.security.cert.X509Certificate[] getAcceptedIssuers() {
             return null;
           }
           public void checkClientTrusted(
               java.security.cert.X509Certificate[] certs, String authType) {
           }
           public void checkServerTrusted(
               java.security.cert.X509Certificate[] certs, String authType) {
           }
         }
     };

    // Install the all-trusting trust manager
     try {
       SSLContext sc = SSLContext.getInstance("SSL");
       sc.init(null, trustAllCerts, new java.security.SecureRandom());
       HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
     } catch (GeneralSecurityException e) {
     }

      HostnameVerifier allHostsValid = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
     };

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
   }
#end if
 
Last edited:

udg

Expert
Licensed User
Per essere certo di aver capito bene: presso un cliente hai una bilancia che incorpora un mini-server http; da casa/ufficio, se sul PC lanci IE questi riesce a collegarsi alla bilancia e permetterti la teleassistenza, ma se lanci il tuo tool B4J il collegamento fallisce. Giusto?
 

Xfood

Active Member
Licensed User
Per essere certo di aver capito bene: presso un cliente hai una bilancia che incorpora un mini-server http; da casa/ufficio, se sul PC lanci IE questi riesce a collegarsi alla bilancia e permetterti la teleassistenza, ma se lanci il tuo tool B4J il collegamento fallisce. Giusto?
esatto,
piu che fallisce si apre la schermata di benvenuto e poi mi da questo errore
Access denied.
Client does not have access to the resource on the server.
 

udg

Expert
Licensed User
E' come se mancasse qualcosa in Header o simili. Il client si presenta al server e questi non lo riconosce perfettamente (in pratica lo respinge). Ma almeno sappiamo che non è un problema di configurazione di rete/router..
Prova a cercare qualche stringa che "simuli" IE, magari è tutto lì.
B4X:
Dim j As HttpJob
j.Initialize("job name", Me)
j.Download(<link>) 'it can also be PostString or any of the other methods
j.GetRequest.SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0")
 

Xfood

Active Member
Licensed User
l'unica cosa che faccio per utilizzare internet explore, metto nella configurazione di java installata sul pc, su sicurezza,
lista siti attendibili, e metto l'indirizzo ip della bilancia tipo
e cosi va ( sempre su internet explorer)
 

udg

Expert
Licensed User
Qualcosa non torna. Gli indirizzi del tipo 192.168.. sono di classe C e privati, quindi non adatti a funzionare su Internet. Dall'esterno dovresti puntare all'IP pubblico del router ed avere su quest'ultimo una regola che re-indirizzi sull'IP assegnato alla bilancia.
Cosa diversa è se il PC è sulla stessa rete della bilancia (ovvero sei presso il cliente o stai utilizzando una VPN che ti "materializza" presso il cliente).
 

Xfood

Active Member
Licensed User
Qualcosa non torna. Gli indirizzi del tipo 192.168.. sono di classe C e privati, quindi non adatti a funzionare su Internet. Dall'esterno dovresti puntare all'IP pubblico del router ed avere su quest'ultimo una regola che re-indirizzi sull'IP assegnato alla bilancia.
Cosa diversa è se il PC è sulla stessa rete della bilancia (ovvero sei presso il cliente o stai utilizzando una VPN che ti "materializza" presso il cliente).
faccio teleassistenza dal box del punto vendita , cioe da casa mi collego con il pc del cliente,
e poi dal pc del cliente avvio la teleassistenza presso la bilancia della salumeria, macelleria ecc.
questo e quello che succede con la mia piccola procedura:
1604078934774.png

1604078948452.png





e invece questo quello che succede con internert explore del pc locale
1604078984138.png
 

udg

Expert
Licensed User
Da quel che capisco, il tuo pc di casa si connette a quello del cliente e poi lancia IE da quello (nel senso che lo lancia dalla finestra di collegamento remoto ormai attivo).
Prova a copiare il tuo tool B4J sul pc del cliente ed eseguirlo da lì. Funziona?
 

Xfood

Active Member
Licensed User
Da quel che capisco, il tuo pc di casa si connette a quello del cliente e poi lancia IE da quello (nel senso che lo lancia dalla finestra di collegamento remoto ormai attivo).
Prova a copiare il tuo tool B4J sul pc del cliente ed eseguirlo da lì. Funziona?
anche la mia applicazioncina viene lanciata dal pc del cliente, ho copiato il file jar e come vedi la prima schermata e' ok, e poi mki da quel errore.
 

udg

Expert
Licensed User
Ok, già provato anche con il SetHeader? Non cambia nulla?
 

udg

Expert
Licensed User
Post #4 :)
 

Xfood

Active Member
Licensed User
scusa la mia ignoranza,

B4X:
'il mio bottone e' cosi
Sub Button1_Click
    WebView1.LoadUrl(TextField1.Text.Trim)
End Sub

'devo modificarlo cosi:

Sub Button1_Click
Dim j As HttpJob
j.Initialize("job name", Me)
j.Download(TextField1.Text.Trim) 'it can also be PostString or any of the other methods
j.GetRequest.SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0")
WebView1.LoadUrl(TextField1.Text.Trim)
End Sub
provato con la modifica sopra, non so se corretta, ma non va
 

udg

Expert
Licensed User
Guarda qui. Non so se sia risolutivo, ma almeno questo aspetto è coperto. Il mio suggerimento del punto #4 non si applicava direttamente ad una webview.loadurl, ma poteva andar bene se si usava httpjob per scaricare una pagina e poi passarla d una webview.
Ad ogni modo, prova a seguire le indicazioni di Marco che sono decisamente più pertinenti.
 

Xfood

Active Member
Licensed User
Domani provo, ho visto l'esempio ed e' x b4a,
Sara compatibile x b4j?
Sopratutto i comandi
Dim r As Reflector
r.Target = w
 

Sagenut

Well-Known Member
Licensed User
Anche se forse non è la soluzione al tuo problema ti propongo un'altra stringa per l'Header
B4X:
j.GetRequest.SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36")
 

Xfood

Active Member
Licensed User
Anche se forse non è la soluzione al tuo problema ti propongo un'altra stringa per l'Header
B4X:
j.GetRequest.SetHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36")
Grazie x il tuo interessamento,
Devo utilizzare questa striga come nel post 13?
Faro delle prove. E poi ti faccio sapere.
 

Sagenut

Well-Known Member
Licensed User
Credo sia meglio seguire l'esempio di @MarcoRome che ti ha indicato @udg
Quindi userai la stringa in
B4X:
m.Put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36")
dal codice di quella discussione.
 
Top