Вызов метода родительского окна из 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/ чтобы совершать междоменные звонки