Вызов метода родительского окна из Iframe

Я знаю, что это проблема кросс-браузерной связи или политики происхождения, и браузер не разрешает такую ​​связь.

Мне нужно обойти этот сценарий использования. У меня есть родительская страница в HTTP, и оттуда я отправляю форму в HTTPS, мое требование - не уходить со страницы, и форма открывается в оверлее.

Это мои текущие настройки JSP

<form:form action="https://localhost:9002/myApp/springSecurity/login" class="login-form error-info"  id="loginForm"  method="post" commandName="loginForm" target="guestFrame">

 <iframe width="0" frameborder="0" scrolling="no" name="guestFrame" >

с сервера я отправляю java-скрипт в ответе для добавления в Iframe, это java-скрипт, отправляемый с сервера

<html><body>"+ "<script type=\"text/javascript\">parent.handleResponse('error',securityLoginStatus.getLoginFailedException());</script>"+ "</body></html>")

я уже определил метод в родительском окне, а именно handle-response но я получаю следующую ошибку в браузере

Permission denied to access property 'handleResponse'

я даже пытался с parent.wwindow.handleResponse но получаю ту же ошибку. Есть ли способ, как я могу общаться с родительским окном из Iframe?

2 ответа

Решение

Как вы сказали ранее, нет способа избежать отказа в разрешении перекрестного происхождения, если только html origin и судьба не находятся под http://localhost:9002 домен.

Для удобства я рекомендую использовать http-связь с документами javascript/json/jsonp. Вы можете попробовать jQuery с чем-то вроде этого:

<script type="text/javascript">
function sendPost () {
    $.ajax({
      type: 'POST',
      url: 'https://localhost:9002/myApp/springSecurity/login',
      data: $("#guestFrame").serialize(),
      error: function(data, status) {
        // alert('Error ' + status);
      }
    });
}
function handleResponse(obj) {
    if (obj.type==="error") {
        alert("Error: " + obj.mssg);
    }
}
</script>

<form ...>
 ...
 <input type="submit" value="send" onclick="sendPost();return(false)"/>
</form>

И чтобы избежать ограничения CORS, https://localhost:9002/myApp/springSecurity/login Ответ html должен быть кодом javascript и включать следующие заголовки:

<% 
response.setHeader("Content-type", "application/x-javascript");
response.setHeader("Access-Control-Allow-Origin", "*");
%>

Пример ответа Javascript, который сможет вызывать "handleResponse" своего родительского вызывающего:

handleResponse({'type':'error', 'mssg': 'your_login_failed_exception'});

Вы также можете использовать платформу, такую ​​как http://easyxdm.net/wp/ чтобы совершать междоменные звонки

Другие вопросы по тегам