¿Por qué Java tiene problemas entre dominios?
Prólogo
Creo que al escribir scripts de front-end, a menudo te encuentras con la situación de enviar datos al backend. Sin embargo, debido a las limitaciones del navegador, los datos entre diferentes nombres de dominio no pueden. se comunican entre sí, ¿cómo intercambian datos el front-end y el back-end?
Debido a consideraciones de seguridad, JavaScript no permite que las páginas llamen a objetos de otras páginas entre dominios. Entonces la pregunta es: ¿qué es un problema entre dominios?
Respuesta: Esto se debe a la restricción de la política del mismo origen del navegador, que ahora utilizan todos los navegadores que admiten JavaScript. Entonces, ¿qué es la homología? La llamada homología se refiere a "lo mismo" en tres aspectos:
Mismo nombre de dominio
Mismo protocolo
Mismo puerto
El siguiente es un ejemplo. Algunos ejemplos para ayudar a comprender mejor la misma política de origen.
URL
Descripción
Permitir comunicación
/a.js?
/b.js Mismo dominio nombre permitido
/a.js?
/a.js No se permiten diferentes nombres de dominio
: 8000/a.js
/ b.js No se permite el mismo nombre de dominio y diferentes puertos
/a.js?
/b.js No se permite el mismo nombre de dominio y diferentes protocolos
Los problemas de manejo de conexiones transfronterizas en dominios JAVA generalmente tienen las siguientes dos soluciones comunes.
La primera solución
El código de fondo agrega configuraciones de encabezado en el servlet solicitado: Response.setHeader("Access-Control-Allow-Origin", "*"); >
PrintWriter fuera =null;
probar
{
salida = respuesta.getWriter();
} captura ( IOException e)
{
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
out.print("{'status':'ok'}");
out.flush()
out.close(); >
El encabezado Access-Control-Allow-Origin se utiliza en el estándar W3C para verificar si se puede pasar la solicitud entre dominios. Si el valor es *, indica que se puede acceder a la página actual a través de dominios. No permitido por defecto.
En el JS front-end, debe realizar una solicitud al Servlet. El código de solicitud es el siguiente: $.ajax({
url: "su URL",
tipo: "obtener o publicar",
tipo de datos: "json",
datos: {
....
},
éxito: función(datos){
...
}
La segunda solución
Solicitud entre dominios a través de jsonp. Aunque solo hay una letra de diferencia entre JSONP y JSON, son cosas completamente diferentes. Mucha gente los confunde fácilmente. JSON es un formato de intercambio de datos y JSONP no. -Formato de formato. Protocolo oficial de interacción de datos entre dominios.
Primero, hablemos de cómo el JS front-end envía solicitudes.
El código es el siguiente: $.ajax({
url: "tu URL",
tipo: "obtener o publicar",
async: false ,
dataType: "jsonp",
//El servidor se utiliza para recibir el parámetro del nombre de la función de la llamada de devolución de llamada
jsonp: "callbackparam ",
//nombre de función de la devolución de llamada
jsonpCallback: "success_jsonpCallback",
éxito: función(datos){
consola .log(datos) ;
},
error: función(datos){
console.log(datos);
}
});
El callbackparam y Success_jsonpCallback aquí pueden entenderse como los pares clave-valor de los datos enviados, que se pueden personalizar, pero el callbackparam debe acordar el nombre del parámetro con el fondo, porque el fondo necesita obtener esto El valor en el parámetro (es decir, Success_jsonpCallback).
Ahora, lo más importante es cómo obtener y devolver datos en segundo plano. El código es el siguiente: PrintWriter out =null;
String callback=req.getParameter("callbackparam");
String json=callback "({'status':'ok ' })";
prueba
{
out = resp.getWriter();
} captura (IOException e)< / p>
{
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
out .print(json);
out.flush();
out.close();
Primero necesita obtener el valor del parámetro llamado callbackparam, aquí El valor obtenido es "success_jsonpCallback". Luego agregue un par de paréntesis a este valor. Coloque el contenido de datos que necesita devolver entre paréntesis. Por ejemplo, aquí devuelvo un objeto JSON. Por supuesto, también puede devolver otros objetos, como simplemente devolver datos de tipo cadena. Finalmente, los datos devueltos por el JS front-end son así: Success_jsonpCallback({'status': 'ok'})
El navegador los analizará automáticamente en un objeto json. Solo es necesario usarlo directamente en la función de devolución de llamada exitosa. data.status funcionará.