Προς το περιεχόμενο

JavaScript γιατί χρειάζομαι επέκταση για να δουλέψει η XMLHttpRequest(); ;


manolis940

Προτεινόμενες αναρτήσεις

Ασχολούμαι τις τελευταίες μέρες με την XMLHttpRequest . Γενικά είδα ότι χρησιμοποιείτε σε διάφορες περιπτώσεις όπως το να τραβήξεις δεδομένα από άλλα sites με διαφορετικό domain να ανανεώσεις  " κομμάτια " του site χωρίς να γίνει refresh σε όλη την σελίδα κ.α. 

 

Μιας και δουλεύω τις τελευταίες μέρες με το SoftOne και τα web Services του θεώρησα ότι η XMLHttpRequest θα μου είναι απαραίτητη. 

 

Για όσους δεν ξέρουν το softone

Είναι ένα πρόγραμμα εμπορικής διαχείρισης και έχει την δυνατότητα online request μέσω των cloud υπηρεσιών του

 

Ο κώδικας και το πρόβλημα μου

Ο παρακάτω κώδικας δουλεύει άλλα προϋποθέτει να έχω την επέκταση Allow-Control-Allow-Origin:* στον browser( για chrome). Πως γίνεται να κάνω τον κώδικα μου να λειτουργήσει χωρίς την επέκταση αυτή ;

 

Ο κώδικας του site:

<head>
	<meta charset ="utf-8"/>
	
	<script>
		function getLoginJSON()
		{
		        var xhr;
			xhr = new XMLHttpRequest();
			var url = "http://demo.oncloud.gr/s1services?login";
			
			xhr.open("POST", url);
			xhr.setRequestHeader("Access-Control-Allow-Origins", "application/json");
			var data = JSON.stringify({"service":"login", "username":"demo", "password":"demo", "appId":"156"}); // appId: Μια παράμετρος του softOne
			xhr.send(data);

			xhr.onreadystatechange = function () 
			{
				if (xhr.readyState === 4 && xhr.status === 200) 
					document.getElementById("p").innerHTML = xhr.responseText;
			};
		}
	</script>
</head>

<body onload =getLoginJSON() style = "overflow-x:scroll; color:white; background-color:#33334d" >
	<p id = "p">Wait Server response .....<p>
	
</body>

Για όσους δεν θέλουν να προσθέσουν την επέκταση για να δοκιμάσουν τον κώδικα παραθέτω δύο print screens με ανοικτή και κλειστή την επέκταση 

 

http://prntscr.com/fv6hpb

http://prntscr.com/fv6ie3

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν θεωρείται ασφαλές να κάνεις κλήσεις σε δεδομένα από άλλο domain χωρίς αυτό να το επιτρέπει στα header του.

Ή τα βάζεις όλα σε ίδιο domain, ή με κάποιον τρόπο πρέπει να παρέχεις το ανάλογο cross-origin header.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν θεωρείται ασφαλές να κάνεις κλήσεις σε δεδομένα από άλλο domain χωρίς αυτό να το επιτρέπει στα header του.

Ή τα βάζεις όλα σε ίδιο domain, ή με κάποιον τρόπο πρέπει να παρέχεις το ανάλογο cross-origin header.

 

Δηλαδή θες να μου πεις ότι "http://demo.oncloud.gr/s1services?login " φταίει που δεν μου δίνει τα δεδομένα ; Και αν αυτό ισχύει γιατί διορθώνεται από την μεριά του client με κάποιο add-on και όχι από κάποια παραμετροποίηση από την μεριά του server ;

Όταν λες να τα βάλω στο ίδιο domain ?? Δηλαδή να τα βάλω όλα στο "http://demo.oncloud.gr/s1services?login" ;   Το συγκεκριμένο δεν το έχω σηκώσει εγώ αλλά η ίδια η softOne για να παρέχει υπηρεσίες όπως web interface του προγράμματος και διάφορα άλλα web services. Εμένα ο σκοπός μου είναι να εκμεταλλευτώ αυτά τα web Services. 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δηλαδή θες να μου πεις ότι "http://demo.oncloud.gr/s1services?login " φταίει που δεν μου δίνει τα δεδομένα ; Και αν αυτό ισχύει γιατί διορθώνεται από την μεριά του client με κάποιο add-on και όχι από κάποια παραμετροποίηση από την μεριά του server ;

Όταν λες να τα βάλω στο ίδιο domain ?? Δηλαδή να τα βάλω όλα στο "http://demo.oncloud.gr/s1services?login" ;   Το συγκεκριμένο δεν το έχω σηκώσει εγώ αλλά η ίδια η softOne για να παρέχει υπηρεσίες όπως web interface του προγράμματος και διάφορα άλλα web services. Εμένα ο σκοπός μου είναι να εκμεταλλευτώ αυτά τα web Services. 

 

ναι γενικά φταίει το demo.oncloud.gr που δεν στέλνει τα κατάλληλα headers (προφανώς και φταίει και ο browser που τα ελέγχει και σέβεται τις οδηγίες αυτές!). Μια λύση για την τοποθέτηση στο ίδιο domain είναι το ανάποδο, να βάλεις μια κλήση στον server σου που από πίσω μπορεί απλά να λειτουργεί ως proxy και να δίνει την απάντηση από το url που θέλεις εσύ.

Δεν ξέρω αν μπορείς να επικοινωνήσεις μαζί τους ώστε να βάλουν το cross origin header στις απαντήσεις από τα Urls τους.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ναι γενικά φταίει το demo.oncloud.gr που δεν στέλνει τα κατάλληλα headers (προφανώς και φταίει και ο browser που τα ελέγχει και σέβεται τις οδηγίες αυτές!). Μια λύση για την τοποθέτηση στο ίδιο domain είναι το ανάποδο, να βάλεις μια κλήση στον server σου που από πίσω μπορεί απλά να λειτουργεί ως proxy και να δίνει την απάντηση από το url που θέλεις εσύ.

Δεν ξέρω αν μπορείς να επικοινωνήσεις μαζί τους ώστε να βάλουν το cross origin header στις απαντήσεις από τα Urls τους.

Λίγο δύσκολο. Όμως απ όσο ξέρω η σύνδεση του softOne και ενός site ( πχ ενός e-shop) γίνεται μέσω των web services. Απ ότι βλεπω και ο κώδικας μου δεν είναι ασφαλής. Πχ ο κωδικός που γράφω στο json script είναι εμφανής σε ένα χρήστη του site μου. Οπότε μήπως πρέπει να μιλήσω με κάποιο άλλο τρόπο με το server που να μην φαίνεται στο site ;  

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λίγο δύσκολο. Όμως απ όσο ξέρω η σύνδεση του softOne και ενός site ( πχ ενός e-shop) γίνεται μέσω των web services. Απ ότι βλεπω και ο κώδικας μου δεν είναι ασφαλής. Πχ ο κωδικός που γράφω στο json script είναι εμφανής σε ένα χρήστη του site μου. Οπότε μήπως πρέπει να μιλήσω με κάποιο άλλο τρόπο με το server που να μην φαίνεται στο site ;  

ναι, βλέπω έχεις και στοιχεία πρόβασης, πολύ κακή επιλογή να γίνει από client side.. ειδικά αν πρόκειται για public view site.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

To object XMLHttpRequest που χρησιμοποιείται για την ανταλλαγή των data με τον web server στο παρασκήνιο είναι o Ajax βασικά.. 

 

και η πολιτική ασφάλειας λέγεται Same Origin Policy.. 

 

για την απορία σου εδώ..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λίγο δύσκολο. Όμως απ όσο ξέρω η σύνδεση του softOne και ενός site ( πχ ενός e-shop) γίνεται μέσω των web services. Απ ότι βλεπω και ο κώδικας μου δεν είναι ασφαλής. Πχ ο κωδικός που γράφω στο json script είναι εμφανής σε ένα χρήστη του site μου. Οπότε μήπως πρέπει να μιλήσω με κάποιο άλλο τρόπο με το server που να μην φαίνεται στο site ;  

 

Σωστά, ο κώδικας σου δεν είναι ασφαλής επειδή η προσέγγισή σου είναι λάθος. Θα πρέπει να χρησιμοποιήσεις τον δικό σου server για να "μιλήσει" με το server της softone. Τα δεδομένα στον χρήστη δεν θα τα τραβάς από την softone, αλλά από τον server σου.

 

Ουσιαστικά θα χρειαστείς μια server-side γλώσσα όπως είναι η PHP. Από εκεί θα κάνεις μια κλήση προς την softone (http://php.net/manual/en/refs.webservice.php) για να τραβήξεις ότι δεδομένα χρειάζεσαι. Ιδανικά τα αποθηκεύεις στη βάση δεδομένων σου και από εκεί εμφανίζεις στον χρήστης του site σου ότι χρειάζεται. Μπορείς να χρησιμοποιήσεις και ajax, απλά θα γίνει κλήση στον δικό σου server και όχι σε κάποιον τρίτο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 χρόνια αργότερα...
Δημοσ. (επεξεργασμένο)

Γεια και από μένα. 

Η απάντηση είναι αυτό που λέει ο @kastorass

"Σωστά, ο κώδικας σου δεν είναι ασφαλής επειδή η προσέγγισή σου είναι λάθος. Θα πρέπει να χρησιμοποιήσεις τον δικό σου server για να "μιλήσει" με το server της softone. Τα δεδομένα στον χρήστη δεν θα τα τραβάς από την softone, αλλά από τον server σου."

 

Αντί δηλαδή

var url = "http://demo.oncloud.gr/s1services?login";

Θα βάλεις

var url = "http://myserver/myfile";

To myfile θα κάνει άλλο  post request στο demo.oncloud.gr και echo την απάντηση.

 

 

 

 

 

Επεξ/σία από k33theod
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...