Ajax post i get + ServerSocket java - problem

0

Witam.
Nie za bardzo rozumiem ajaxa, tego jak to się komunikuje itd. Próbuję zrobić prosty serwer w java oparty na ServerSocket, który ma obierać dane wysyłane metodą POST z aplikacji w js. Czyli w pliku app.js będzie to fragment w liniach od 20 do 25 data: { id: lookAtObjectId, x: _position.x, y: _position.y, z: _position.z, }, . Testowo coś tam próbuję wysłać. Następnie serwer będzie jako thread pool, żeby obsługiwać niezależnie kilka obiektów, ale zanim do tego dojdę muszę ogarnąć jak to ma zbierać dane o pozycji obiektu następnie odsyłać z powrotem do przeglądarki. Ale o ile do serwera coś dociera, co widać na obrazku niżej w terminalu, to z odebraniem z powrotem odpoowiedzi mam problem. Biblioteka Three.js jest aktualna pobrana z oficjalnej strony projektu. Według mnie wina gdzieś leży po stronie kodu js, ale może też to być kwestia nagłówków jakie odsyłam przez serwer w lini 27 out.println("test"); . Nie wiem za bardzo jak to poprawić.... Wygląda to jakoś tak:

W konsoli (F12) dostaję takie informacje zamiast odpowiedzi jako success:

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help http://xhr.spec.whatwg.org/ jquery-3.4.1.min.js:2:80627
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:59091/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).[Learn More]
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:59091/?_=1579519775650. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).[Learn More]
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:59091/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).[Learn More]
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:59091/?_=1579519775651. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).[Learn More]
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:59091/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).[Learn More]
( itd ... )

index.html

<html>
    <head>
        <title>Test app</title>
    </head>
<body>
    
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src="three.min.js"></script>
    <script src="app.js"></script>

</body>
</html>

app.js



var camera, scene, renderer;
			//var mesh;
			var id = 0;
			var lookAtObjectId = 8;
			var speed = 1;
			var _position = {x:0, y:0, z:0};
			var _move = {up:false, down:false, left:false, right:false};
			
			 // write to file test
				    $(window).keypress(function (e) {
                    var data = _position;
                    $.ajax({
                        url: 'http://localhost:59091',
						type: 'POST',
						async: false,
						//dataType: 'json',
						cache: false,
                        data: { 
							id: lookAtObjectId, 
							x: _position.x, 
							y: _position.y, 
							z: _position.z,  
						},
                        //data: $(window)._position,
                        success: function(result) {
                            console.log('the data was successfully sent to the server');
                            //return data;
                        }
					});
					
					$.ajax({
						url: 'http://localhost:59091',
						type: 'GET',
						async: true,
						crossDomain:true,
						//dataType: 'json',
						cache: false,
						success: function(res) {
							console.log(res);
							//alert(res);
						}
					});
					
					
					
                    });
                    
                    
			
			init();
			animate();

			function init() {

				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
				camera.position.z = 400;
				
				scene = new THREE.Scene();
				
				


				var size = 1000, divisions = 100;
				var gridHelper = new THREE.GridHelper(size, divisions);
				gridHelper.rotation.x = -40;
				scene.add( gridHelper );

				scene.add( new createObject() );
				scene.add( new createObject() );
						
			

				renderer = new THREE.WebGLRenderer( { antialias: true } );
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );
				document.body.appendChild( renderer.domElement );

				//

				window.addEventListener( 'resize', onWindowResize, false );
				
				window.addEventListener( 'keydown', function(e) {				
				    //console.log( e.keyCode );
				    // W - 87 move up
				    // S - 83 down
				    // A - 65 left
				    // D - 68 right
				    switch (e.keyCode) {
				        case 87: 
				            //scene.getObjectById(lookAtObjectId).position.x += speed;
				            //break;
				            _move.up	= true;	
				            break;		            
				        case 83:
				            //scene.getObjectById(lookAtObjectId).position.x -= speed;
				            //break;
				            _move.down	= true;	
				            break;
				        case 65:
				            //scene.getObjectById(lookAtObjectId).position.z += speed;
				            //break;
				            _move.left	= true;	
				            break;
				        case 68:  
				            //scene.getObjectById(lookAtObjectId).position.z -= speed;
				            //break;
				            _move.right	= true;	
				            break;
				    }
				    
				    //console.log(document.body);
				    
				   

				    
				}, false );
			
				window.addEventListener( 'keyup', function(e) {
				    switch (e.keyCode) {
				        case 87: 
				            _move.up	= false;	
				            break;		            
				        case 83:
				            _move.down	= false;
				            break;	
				        case 65:
				            _move.left	= false;
				            break;	
				        case 68:  
				            _move.right	= false;
				            break;	
				    }
				}, false );

			}		
			
			function createObject() {
			    var geometry = new THREE.BoxBufferGeometry( 50, 50, 50 );
				var material = new THREE.MeshBasicMaterial( { color: 'yellow' } );
				material.wireframe = true;
                
				var mesh = new THREE.Mesh( geometry, material );
				mesh.id = (++id);
				//console.log(mesh.id);
				
				return mesh;
			}

			function onWindowResize() {

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			}

			function animate() {

				requestAnimationFrame( animate );

				//mesh.rotation.x += 0.005;
				//mesh.rotation.y += 0.01;
				//scene.getObjectById(8).position.x += (Math.sin(0.1));
				scene.getObjectById(9).position.y += 0.1;
				scene.getObjectById(9).rotation.z -= 0.01;
				//console.log();
				
				if (_move.up) {
				    _position.z -= speed;
				}
				if (_move.down) {
				    _position.z += speed;
				}
				if (_move.left) {
				    _position.x -= speed;
				}
				if (_move.right) {
				    _position.x += speed;
				}
				
				scene.getObjectById(lookAtObjectId).position.x = _position.x;
				scene.getObjectById(lookAtObjectId).position.y = _position.y;
				scene.getObjectById(lookAtObjectId).position.z = _position.z;
				
        	    camera.lookAt(scene.getObjectById(lookAtObjectId).position);
        	  	//console.log(scene.getObjectById(8).position);
				renderer.render( scene,  camera);

}

Server.java

import java.io.IOException;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.Scanner;


/**
 * A simple TCP server. When a client connects, it sends the client the current
 * datetime, then closes the connection. This is arguably the simplest server
 * you can write. Beware though that a client has to be completely served its
 * date before the server will be able to handle another client.
 */
public class Server {
    public static void main(final String[] args) throws IOException {
        try (ServerSocket listener = new ServerSocket(59091)) {
            System.out.println("The date server is running...");
            BufferedReader in;
            String inputLine;
            int i = 0;
            while (true) {
                try (Socket socket = listener.accept()) {
                    final PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    out.println("test"); 

                    in = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));

                        while ((inputLine = in.readLine()) != null) {
                            //if (i == 11)
                            System.out.println(i + " ===> " + inputLine);
                            i++;
                        }
                        
                     i = 0;   
                        
                    //System.out.println(in.());
                    //out.println(new Date().toString());
                }
            }
        }
    }
}

Screenshot from 2020-01-20 1245.png

2

Na podstawie informacji z konsoli:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:59091/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).[Learn More]

Oznacza to, że przeglądarka zablokowała zapytanie XMLHttpRequest (ajax) wysłane z JS do zasobu leżącego w innej domenie. Przeglądarki internetowe domyślnie blokują takie zapytania z powodów bezpieczeństwa. Dozwolone są tylko zapytania do zasobów leżących na tej samej domenie chyba że serwer dołączy nagłówek Access-Control-Allow-Origin, w którym podane jest z jakiej domeny można odwoływać się do danego zasobu. Więcej w temacie w artykule na MDN.

Zakładając jednak, że zarówno strona, którą tworzysz, jak i serwer uruchamiane są lokalnie, problem wydaje się leżeć w innym miejscu. Mianowicie, w drugim zapytaniu AJAX dodajesz opcję crossDomain: true. Na podstawie dokumentacji JQuery, wymusza to użycie formatu JSONP, stosowanego właśnie w obchodzeniu ograniczenia do tej samej domeny.

Widzę 2 rozwiązania:

  1. jeżeli serwer leży w innej domenie niż strona, dodaj odpowiednie nagłówki dla CORS i obsługę JSONP
  2. jeżeli serwer leży w tej samej domenie, spróbuj wywołać zapytanie AJAX bez opcji crossDomain
0

@złoty: Dzięki wielkie :) Właśnie potrzebowałem choćby naprowadzenia na opis jak to ma być poprawnie zrobione...

-- edit --
Zamazałem adres w przeglądarce, a okazało się że to był największy problem jednak. To był adres do pliku file://. Dopiero teraz przeczytałem że to ogarnicza CORS i m.in. w Origin zwraca null zamiast adres strony. Wziąłem odpaliłem serwer wbudowany w python27 python -m SimpleHTTPServer i wtedy łączę się z localhost:8000 i chyba jest ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1