Window.close () не закрывает Google Oauth Popup [Java-сервлеты] - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь реализовать функцию Google Oauth.Так работает моя программа.Во-первых, файл index.jsp запускается и открывает страницу примерно так: enter image description here

Мой код index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Website</title>
</head>
<style>
h1 {
	font-family: Bookman;
	font-size: 150px;
	font-style: normal;
	font-variant: normal;
	font-weight: 800;
	line-height: 26.4px;
	text-color: white;
	text-align: center;
}
p {
	font-family: Bookman;
	font-size: 50px;
	font-style: normal;
	font-variant: normal;
	font-weight: 800;
	line-height: 26.4px;
	text-color: white;
	text-align: center;
}
.main_background{
    background-image: url("img/main_page_background.jpg");
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;
}
</style>
<body class=main_background>
<h1 style="color:white">Title</h1>
<p style="color:white">Subtitle</p>
<form action="google_oauth" method="post">
<input type="submit" value="Sign In With Google"/>
</form>

</body>
</html>

В результате пользователь нажимает кнопку «Войти с помощью кнопки Google», которая перенаправляет его на сервлет.Внутри сервлета открывается другой HTML-файл, используя следующий код:

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		File htmlFile = new File("C:\\Users\\neel-\\OneDrive\\Eclipse Workspace\\Website\\Website\\WebContent\\google_oauth.html");
		Desktop.getDesktop().browse(htmlFile.toURI());
	}

}

Я понимаю, что могу просто внедрить это в файл .jsp, но в дальнейшем мне понадобится перенаправление.Что происходит после открытия HTML-файла, мы получаем окно, подобное этому.

enter image description here

Открываемый html-файл - это файл google_ouath.html с кодом:

<!DOCTYPE html>
<html>
<head>
    <script src="jquery.js"></script>
    <script>
        var OAUTHURL    =   'https://accounts.google.com/o/oauth2/auth?';
        var VALIDURL    =   'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=';
        var SCOPE       =   'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email';
        var CLIENTID    =   '778647136201-d9trubpsuokohuj9a0c9bgufpo1qvqtf.apps.googleusercontent.com';
        var REDIRECT    =   'http://localhost:8080/Website/main_page'
        var LOGOUT      =   'http://accounts.google.com/Logout';
        var TYPE        =   'token';
        var _url        =   OAUTHURL + 'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE;
        var acToken;
        var tokenType;
        var expiresIn;
        var user;
        var loggedIn    =   false;

        function login() {
            var win         =   window.open(_url, "windowname1", 'width=800, height=600'); 

            var pollTimer   =   window.setInterval(function() { 
                try {
                    console.log(win.document.URL);
                    if (win.document.URL.indexOf(REDIRECT) != -1) {
                        window.clearInterval(pollTimer);
                        var url =   win.document.URL;
                        acToken =   gup(url, 'access_token');
                        tokenType = gup(url, 'token_type');
                        expiresIn = gup(url, 'expires_in');
                        win.close();
                        validateToken(acToken);
                    }
                } catch(e) {
                }
            }, 500);
        }

        function validateToken(token) {
            $.ajax({
                url: VALIDURL + token,
                data: null,
                success: function(responseText){  
                    getUserInfo();
                    loggedIn = true;
                    $('#loginText').hide();
                    $('#logoutText').show();
                },  
                dataType: "jsonp"  
            });
        }

        function getUserInfo() {
            $.ajax({
                url: 'https://www.googleapis.com/oauth2/v1/userinfo?access_token=' + acToken,
                data: null,
                success: function(resp) {
                    user    =   resp;
                    console.log(user);
                    $('#uName').text('Welcome ' + user.name);
                    $('#imgHolder').attr('src', user.picture);
                },
                dataType: "jsonp"
            });
        }

        function gup(url, name) {
            name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
            var regexS = "[\\#&]"+name+"=([^&#]*)";
            var regex = new RegExp( regexS );
            var results = regex.exec( url );
            if( results == null )
                return "";
            else
                return results[1];
        }

        function startLogoutPolling() {
            $('#loginText').show();
            $('#logoutText').hide();
            loggedIn = false;
            $('#uName').text('Welcome ');
            $('#imgHolder').attr('src', 'none.jpg');
        }

    </script>
</head>

<body>
    <a href='#' onClick='login();' id="loginText"> Click here to login </a>
    <a href="#" style="display:none" id="logoutText" target='myIFrame' onclick="myIFrame.location='https://www.google.com/accounts/Logout'; startLogoutPolling();return false;"> Click here to logout</a>
    <iframe name='myIFrame' id="myIFrame" style='display:none'></iframe>
    <div id='uName'></div>
    <img src='' id='imgHolder'/>
</body>
</html>

Однако соответствующие фрагменты кода для этой проблемы:

        function login() {
            var win         =   window.open(_url, "windowname1", 'width=800, height=600'); 

            var pollTimer   =   window.setInterval(function() { 
                try {
                    console.log(win.document.URL);
                    if (win.document.URL.indexOf(REDIRECT) != -1) {
                        window.clearInterval(pollTimer);
                        var url =   win.document.URL;
                        acToken =   gup(url, 'access_token');
                        tokenType = gup(url, 'token_type');
                        expiresIn = gup(url, 'expires_in');
                        win.close();
                        validateToken(acToken);
                    }
                } catch(e) {
                }
            }, 500);
        }

Здесь всплывающее окно открывает клиентский вход в систему, а всплывающее окно закрывается.Вот так.enter image description here

Выше мы видим, что вход в Google выполнен и URL перенаправлен.Однако, возвращаясь к функции login (), win.close () фактически не закрывает всплывающее окно.Я искал в Интернете, и я нашел пару решений, которые не работают.Например, здесь говорится об использовании обходного пути

open(location, '_self').close();

, но это тоже не работает.

Еще одна вещь заключается в том, что в Brock Adams Solution В нем говорится:

, за одним небольшим исключением, нельзя разрешать JavaScript закрывать окно, которое не было открыто этим же JavaScript.

Однако яне думаю, что это проблема.

Вопрос : Как закрыть это всплывающее окно, когда win.close () не работает.

ОБНОВЛЕНИЕ: после попытки применения b4tch's anser.Я получаю следующее: enter image description here

1 Ответ

0 голосов
/ 13 июня 2018

Javascript не должен закрывать окно, которое не было открыто этим же javascript.Это делается из соображений безопасности.

Может быть, вам просто нужно вызвать объект самоопределения, который для настройки этого открытого окна должен быть открыт тем же Java-скриптом.Для этого, если вы попробуете open(location, '_self').close(); вместо win.close(), это должно сработать, как и у меня.Пинг мне, если он все еще не работает.

...