ajax - missing - fetch cors
Solicitud de origen cruzado bloqueada (3)
Así que tengo este controlador http de Go que almacena algo de contenido POST en el almacén de datos y recupera otra información en respuesta. En el back-end utilizo:
func handleMessageQueue(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
if r.Method == "POST" {
c := appengine.NewContext(r)
body, _ := ioutil.ReadAll(r.Body)
auth := string(body[:])
r.Body.Close()
q := datastore.NewQuery("Message").Order("-Date")
var msg []Message
key, err := q.GetAll(c, &msg)
if err != nil {
c.Errorf("fetching msg: %v", err)
return
}
w.Header().Set("Content-Type", "application/json")
jsonMsg, err := json.Marshal(msg)
msgstr := string(jsonMsg)
fmt.Fprint(w, msgstr)
return
}
}
En mi aplicación Firefox OS utilizo:
var message = "content";
request = new XMLHttpRequest();
request.open(''POST'', ''http://localhost:8080/msgs'', true);
request.onload = function () {
if (request.status >= 200 && request.status < 400) {
// Success!
data = JSON.parse(request.responseText);
console.log(data);
} else {
// We reached our target server, but it returned an error
console.log("server error");
}
};
request.onerror = function () {
// There was a connection error of some sort
console.log("connection error");
};
request.send(message);
La parte entrante todo funciona junto y tal. Sin embargo, mi respuesta se está bloqueando. Dándome el siguiente mensaje:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/msgs. This can be fixed by moving the resource to the same domain or enabling CORS.
Probé muchas otras cosas, pero no hay forma de obtener una respuesta del servidor. Sin embargo, cuando cambio mi método Go POST en GET y accedo a la página a través del navegador, obtengo los datos que deseo tanto. Realmente no puedo decidir qué lado sale mal y por qué: podría ser que Go no debería bloquear este tipo de solicitudes, pero también puede ser que mi javascript sea ilegal.
@Egidius, al crear un XMLHttpRequest, debe usar
var xhr = new XMLHttpRequest({mozSystem: true});
¿Qué es mozSystem?
mozSystem Boolean: establecer este indicador en verdadero permite realizar conexiones entre sitios sin necesidad de que el servidor opte por el uso de CORS. Requiere la configuración de mozAnon: true, es decir, esto no se puede combinar con el envío de cookies u otras credenciales de usuario. Esto solo funciona en aplicaciones privilegiadas (revisadas); no funciona en páginas web arbitrarias cargadas en Firefox.
Cambios en tu Manifiesto
En su manifiesto, no olvide incluir esta línea en sus permisos:
"permissions": {
"systemXHR" : {},
}
Necesita otros encabezados, no solo acceso-control-permitir-origen. Si su solicitud tiene el encabezado "Access-Control-Allow-Origin", debe copiarlo en los encabezados de respuesta. Si no es así, debe verificar el encabezado "Origin" y copiarlo en la respuesta. Si su solicitud no tiene encabezados Access-Control-Allow-Origin no Origin, debe devolver "*".
Puede leer la explicación completa aquí: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
y esta es la función que estoy usando para escribir encabezados de dominios cruzados:
func writeCrossDomainHeaders(w http.ResponseWriter, req *http.Request) {
// Cross domain headers
if acrh, ok := req.Header["Access-Control-Request-Headers"]; ok {
w.Header().Set("Access-Control-Allow-Headers", acrh[0])
}
w.Header().Set("Access-Control-Allow-Credentials", "True")
if acao, ok := req.Header["Access-Control-Allow-Origin"]; ok {
w.Header().Set("Access-Control-Allow-Origin", acao[0])
} else {
if _, oko := req.Header["Origin"]; oko {
w.Header().Set("Access-Control-Allow-Origin", req.Header["Origin"][0])
} else {
w.Header().Set("Access-Control-Allow-Origin", "*")
}
}
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
w.Header().Set("Connection", "Close")
}
ERROR : Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at the url. This can be fixed by moving the resource to the same domain or enabling CORS.
Solución:
Encontré solución de solicitud de origen cruzado bolcked "resuelto"
Si está trabajando en un proyecto web y desea obtener datos de un sitio diferente, en algún momento recibe este tipo de error, entonces tiene que usar el archivo htaccess en la carpeta raíz del servidor servidor (no el servidor receptor)
código de actualización
<FilesMatch "/.(php)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>
Si eres un desarrollador de WordPress, actualiza el siguiente código:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index/.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
<FilesMatch "/.(php)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>
# END WordPress
gracias :) feliz codificación: