Я пытаюсь вызвать службу, которая была в другом домене из самого javascript. Я смог запросить услугу перекрестного домена. Но я не могу получить информацию из службы. Некоторые из того, как я был заблокирован одной и той же политикой происхождения. Пожалуйста, помогите мне найти ошибки в коде.Как вызвать REST Webservice из javascript с помощью предпродажного запроса?
Моя Клиентская Javascript Код:
var requestJsonData;
function crossDomainCall(){ ** It will be called by button click **
requestJsonData = createCORSRequest('POST', 'IPAddress/servicePath');
if (requestJsonData){
requestJsonData.onreadystatechange = handler;
requestJsonData.send();
}
else {
alert('Cross Domain Call is not invoked');
}
}
function handler(evtXHR) {
if(requestJsonData.readyState == 4) {
if(requestJsonData.status == 200) {
var response = requestJsonData.responseText;
}
else {
alert(" Invocation Errors Occured " + requestJsonData.readyState + " and the status is " + requestJsonData.status);
}
}
else {
alert("currently the application is at " + requestJsonData.readyState);
}
}
function createCORSRequest(method, url){
var xhr;
xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
код услуги:
@OPTIONS
@Path("/servicePath")
@Produces("*/*")
@Consumes("*/*")
public Response corsRequest() {
Response response = null;
ResponseBuilder builder = null;
builder = Response.ok();
builder.header("Access-Control-Allow-Headers", "X-PINGOTHER");
builder.header("Access-Control-Max-Age","1728000");
builder.header("Access-Control-Allow-Origin","Origin_Ip_Address");
builder.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
builder.header("Content-Type","text/plain");
builder.header("Connection", "Keep-Alive");
response = builder.build();
System.out.println("Exited from Options method");
return response;
}
@POST
@Path("/servicePath")
@Produces("application/json")
public String drawRegions() {
System.out.println("Entered inside Post method");
// Some calculation to arrive jsonObject.
return jsonObject;
}
Из кода, я получил следующее в качестве результатов.
OPTIONS Метод заголовков запросов и ответов
Заголовки запросов:
OPTIONS/SolartisGeoCodeLookUpService/Услуги/drawRegions HTTP/1.1
Ведущий: Cross_Domain_IP_Address
User-Agent: Mozilla/5.0 (X11, Linux x86_64; rv: 25.0) Gecko/20100101 Firefox/25.0
Accept: Текст/HTML, приложение/XHTML + XML, приложение/XML; д = 0,9, /; д = 0,8
Accept-Language: EN-US, ан; д = 0,5
Accept-Encoding: GZIP, выкачать
Происхождение: Origin_IP_Address
Access-Control-Request-метод: POST
Access-Control-Request-Headers: х-pingothe г
соединения: держать-жив
Pragma: нет кэша
Cache-Control: нет кэша
Response Headers
HTTP/1.1 200 OK
Сервер: Apache-Coyote/1.1
Access-Control-Allow-Headers: X-PINGOTHER
Connection: Keep-Alive
контроля доступа-Allow-Origin: Origin_IP_Address
Access-Control-Max-Age: 1728000
Access-Control-Allow-методы: POST, GET, OPTIONS
Content-Type: текст/обычный
Content-Length: 0
Дата: Чт, 12 Dec 2013 12:39:27 GMT
Cache Response Заголовок
Заголовки ответа из кэша
Access-Control- Разрешающая головка ... X-PINGOTHER Access-Control-Allow-Meth ... POST, GET, OPTIONS Access-Control-Max-Age 1728000 Подключение Keep-Alive Cont лор-Length 0 Content-Type текст/обычный Дата Чт, 12 декабря 2013 12:39:27 GMT сервер Apache-Coyote/1,1 контроля доступа, позволяют оригинал Origin_IP_Address
POST метод запроса и ответа Заголовки
Заголовки запросов
POST/servicePath HTTP/1.1
Хост: crossDomain_IP_Address
User-Agent: Mozilla/5.0 (X11; Linux x86_64; с.в.: 25.0) Gecko/20100101 Firefox/25.0
Accept: Текст/HTML, приложение/XHTML + XML, приложение/XML; д = 0,9, /; д = 0,8
Accept-Language: EN -US, ан; д = 0,5
Accept-Encoding: GZIP, выкачать
X-PINGOTHER: пинг-понга
Происхождение: Origin_IP_Address
Connection: Keep-жив
Pragma: нет кэша
Cache-Control: нет кэша
Content-Length: 0
Response Headers
HTTP/1 ,1 200 OK
Сервер: Apache-Coyote/1,1
Content-Type: Текст/JSON
Content-Length: 128
Дата: Чт, 12 декабря 2013 12:39:27 GMT
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ Из javascript дважды был вызван метод обработчика. В первый раз, это придет с "в настоящее время приложение на 2" - readyState значение. Во второй раз, это приключение с «Invocation Errors Occured 4 (readyState value) и кодом состояния 0 (код статуса ответа)». Во второй раз ответ ясно говорит, что вызов службы был остановлен одной политикой происхождения. Но я не знаю, как преодолеть эту проблему и получить доступ к ресурсу. Пожалуйста, помогите мне, исправив мой код.
Можете ли вы использовать Logger.INFO() вместо System.out? Я думаю, что с вашей реализацией CORS должна быть проблема. Вы включили пакет внедрения CORSFilter в web.xml? –
@sivatumma: Я не понял вашу точку зрения. Как включить реализацию CORSFilter в web.xml? Зачем нам это нужно в web.xml? – ArunRaj
Предполагая, что оба домена закодированы вами, чтобы разрешить запрос на перекрестный поиск, ваша служба должна реализовать 'ContainerResponseFilter' и свой' public ContainerResponse фильтр (ContainerRequest req, ContainerResponse contResp) { ...} '. Вы также должны сообщить своему «web.xml», что это сервлет, которому он должен служить. –