콘텐츠로 건너뛰기
리뷰나라
  • JAVASCRIPT
  • JAVA
  • PYTHON
  • C#
  • Android
  • Html

[ajax] 비밀번호를 저장하라는 메시지를 브라우저에 표시하려면 어떻게해야합니까?

Program / 글쓴이 어드민

이봐, 나는 다음과 같은 로그인 대화 상자가있는 웹 응용 프로그램을 만들고 있습니다.

  1. 사용자가 “로그인”을 클릭
  2. 로그인 양식 HTML은 AJAX와 함께로드되어 페이지의 DIV에 표시됩니다.
  3. 사용자는 필드에 사용자 / 패스를 입력하고 제출을 클릭합니다. <form>AJAX를 통해 제출 된 사용자 / 패스가 아닙니다.
  4. 사용자 / 패스가 정상이면 사용자가 로그인 한 상태에서 페이지가 다시로드됩니다.
  5. 사용자 / 패스가 나쁘면 페이지가 다시로드되지 않지만 DIV에 오류 메시지가 나타나고 사용자가 다시 시도해야합니다.

여기에 문제가 있습니다. 브라우저는 다른 사이트에 대해 일반적인 “이 암호를 저장 하시겠습니까?

“autocomplete = ‘on'”으로 <div>in <form>태그를 래핑하려고 시도했지만 아무런 차이가 없었습니다.

로그인 흐름을 크게 재 작업하지 않고도 브라우저가 암호를 저장하도록 제안 할 수 있습니까?

고마워 에릭

내 질문에 추가하기 위해 암호를 저장하는 브라우저를 사용하고 있으며 “이 사이트에서는 절대로”를 클릭하지 않았습니다 … 브라우저가 로그인 형식임을 감지하지 못하는 기술적 문제입니다. 운영자 오류 🙂



답변

이 질문에 대한 완벽한 해결책을 찾았습니다. (Chrome 27 및 Firefox 21에서 이것을 테스트했습니다).

알아야 할 두 가지가 있습니다.

  1. ‘비밀번호 저장’을 트리거하고
  2. 저장된 사용자 이름 / 암호 복원

1. ‘비밀번호 저장’을 트리거하십시오.

들어 파이어 폭스 (21) 가 제출 입력 텍스트 필드 비밀번호 입력 필드를 포함하는 양식이 있음을 감지 할 때, ‘암호 저장’가 시작됩니다. 그래서 우리는 단지 사용해야합니다

$('#loginButton').click(someFunctionForLogin);
$('#loginForm').submit(function(event){event.preventDefault();});

someFunctionForLogin()event.preventDefault()양식을 제출하여 원래 리디렉션 을 차단하는 동안 Ajax 로그인 및 로그인 페이지로 다시로드 / 리디렉션을 수행합니다 .

Firefox 만 다루는 경우 위의 솔루션으로 충분하지만 Chrome 27에서는 작동하지 않습니다. 그런 다음 Chrome 27에서 ‘비밀번호 저장’을 트리거하는 방법을 묻습니다.

들어 크롬 27 , ‘암호 저장’는 트리거 후 가 입력 텍스트 필드를 포함하는 양식을 제출하여 페이지로 리디렉션되는 속성 이름 = ‘이름’으로 입력 암호 필드 속성 이름 = ‘비밀번호’와를 . 따라서 양식 제출로 인해 리디렉션을 차단할 수 없지만 ajax 로그인을 완료 한 후 리디렉션을 수행 할 수 있습니다. (아약스 로그인으로 페이지를 다시로드하지 않거나 페이지로 리디렉션하지 않으려면 불행히도 내 솔루션이 작동하지 않습니다.) 그런 다음 사용할 수 있습니다

<form id='loginForm' action='signedIn.xxx' method='post'>
    <input type='text' name='username'>
    <input type='password' name='password'>
    <button id='loginButton' type='button'>Login</button>
</form>
<script>
    $('#loginButton').click(someFunctionForLogin);
    function someFunctionForLogin(){
        if(/*ajax login success*/) {
            $('#loginForm').submit();
        }
        else {
            //do something to show login fail(e.g. display fail messages)
        }
    }
</script>

type = ‘button’인 단추는 단추를 클릭 할 때 양식이 제출되지 않도록합니다. 그런 다음 아약스 로그인을 위해 버튼에 기능을 바인딩합니다. 마지막으로 호출 $('#loginForm').submit();하면 로그인 한 페이지로 리디렉션됩니다. 로그인 한 페이지가 현재 페이지 인 경우 ‘signedIn.xxx’를 현재 페이지로 바꾸어 ‘새로 고침’을 수행 할 수 있습니다.

이제 Chrome 27의 방법은 Firefox 21에서도 작동합니다. 따라서 사용하는 것이 좋습니다.

2. 저장된 사용자 이름 / 암호를 복원하십시오.

loginForm을 HTML로 하드 코딩 한 경우 loginForm에 저장된 비밀번호를 복원하는 데 아무런 문제가 없습니다.
그러나 저장된 사용자 이름 / 암호는 문서가로드 될 때만 바인드되기 때문에 js / jquery를 사용하여 loginForm을 동적으로 만드는 경우 저장된 사용자 이름 / 암호는 loginForm에 바인드되지 않습니다.
따라서 loginForm을 HTML로 하드 코딩하고 js / jquery를 사용하여 loginForm을 동적으로 이동 / 표시 / 숨겨야했습니다.


비고 :
아약스 로그인을하는 경우 autocomplete='off'와 같은 태그 형태로 추가하지 마십시오

<form id='loginForm' action='signedIn.xxx' autocomplete='off'>

autocomplete='off' 사용자 이름 / 암호를 ‘자동 완성’하도록 허용하지 않기 때문에 loginForm에 사용자 이름 / 암호 복원이 실패합니다.


답변

버튼 을 사용 하여 로그인 :

당신은을 사용하는 경우 type="button"로 onclick사용하여 로그인 처리기 ajax, 다음 브라우저가 제공하지 않습니다 암호를 저장합니다.

<form id="loginform">
 <input name="username" type="text" />
 <input name="password" type="password" />
 <input name="doLogin"  type="button" value="Login" onclick="login(this.form);" />
</form>

이 양식 에는 제출 단추 가없고 조치 필드가 없으므로 브라우저는 비밀번호 저장을 제공하지 않습니다.


제출 버튼을 사용 하여 로그인 :

그러나 단추를 변경하여 type="submit"제출을 처리하면 브라우저가 비밀번호 저장 을 제안 합니다.

<form id="loginform" action="login.php" onSubmit="return login(this);">
 <input name="username" type="text" />
 <input name="password" type="password" />
 <input name="doLogin"  type="submit" value="Login" />
</form>

이 방법을 사용하면 브라우저는 비밀번호 저장을 제공해야합니다.


두 가지 방법 모두에 사용되는 Javascript 는 다음과 같습니다 .

function login(f){
    var username = f.username.value;
    var password = f.password.value;

    /* Make your validation and ajax magic here. */

    return false; //or the form will post your data to login.php
}


답변

나는 이것으로 스스로 고투하고 있었고, 마침내 문제와 실패 원인을 추적 할 수있었습니다.

그것은 모두 내 로그인 양식이 페이지에 동적으로 주입되었다는 사실에서 비롯되었습니다 (backbone.js 사용). 로그인 양식을 index.html 파일에 직접 삽입하자마자 모든 것이 매력처럼 작동했습니다.

브라우저가 기존의 로그인 양식이 있다는 것을 알고 있어야한다고 생각하지만 내 페이지에 동적으로 주입 된 이후로 “실제”로그인 양식이 존재한다는 것을 몰랐습니다.


답변

이 솔루션은 Eric이 코딩 포럼에 게시 한 것을 위해 일했습니다.


메시지가 표시되지 않는 이유는 브라우저가 서버로 다시 새로 고치기 위해 페이지를 물리적으로 만들어야하기 때문입니다. 당신이 할 수있는 작은 트릭은 양식으로 두 가지 작업을 수행하는 것입니다. 첫 번째 조치는 Ajax 코드를 호출하여 제출하는 것입니다. 또한 양식이 숨겨진 iframe을 대상으로합니다.

암호:

<iframe src="ablankpage.htm" id="temp" name="temp" style="display:none"></iframe>
<form target="temp" onsubmit="yourAjaxCall();">

프롬프트가 나타나는지 확인하십시오.

에릭


http://www.codingforums.com/showthread.php?t=123007에 게시 됨


답변

모든 브라우저 (chrome 25, safari 5.1, IE10, Firefox 16)에서 jQuery 및 ajax 요청을 사용하여 비밀번호를 저장하도록 요청 하는 궁극적 인 솔루션 이 있습니다 .

JS :

$(document).ready(function() {
    $('form').bind('submit', $('form'), function(event) {
        var form = this;

        event.preventDefault();
        event.stopPropagation();

        if (form.submitted) {
            return;
        }

        form.submitted = true;

        $.ajax({
            url: '/login/api/jsonrpc/',
            data: {
                username: $('input[name=username]').val(),
                password: $('input[name=password]').val()
            },
            success: function(response) {
                form.submitted = false;
                form.submit(); //invoke the save password in browser
            }
        });
    });
});

HTML :

<form id="loginform" action="login.php" autocomplete="on">
    <label for="username">Username</label>
    <input name="username" type="text" value="" autocomplete="on" />
    <label for="password">Password</label>
    <input name="password" type="password" value="" autocomplete="on" />
   <input type="submit" name="doLogin" value="Login" />
</form>

요령은 양식을 중지하여 자체 방식 (event.stopPropagation ())을 제출하는 대신 자신의 코드 ($ .ajax ())를 보내고 ajax의 성공 콜백에서 양식을 다시 제출하여 브라우저가 양식을 잡고 표시합니다. 비밀번호 저장 요청. 오류 처리기 등을 추가 할 수도 있습니다.

누군가에게 도움이되기를 바랍니다.


답변

spetson의 답변을 시도했지만 Chrome 18에서는 작동하지 않았습니다. 효과는 iframe에로드 핸들러를 추가하고 제출을 방해하지 않는 것입니다 (jQuery 1.7).

function getSessions() {
    $.getJSON("sessions", function (data, textStatus) {
        // Do stuff
    }).error(function () { $('#loginForm').fadeIn(); });
}
$('form', '#loginForm').submit(function (e) {
    $('#loginForm').fadeOut();
});
$('#loginframe').on('load', getSessions);
getSessions();

HTML :

<div id="loginForm">
    <h3>Please log in</h3>
    <form action="/login" method="post" target="loginframe">
            <label>Username :</label>
            <input type="text" name="login" id="username" />
            <label>Password :</label>
            <input type="password" name="password" id="password"/>
            <br/>
            <button type="submit" id="loginB" name="loginB">Login!</button>
    </form>
</div>
<iframe id="loginframe" name="loginframe"></iframe>

getSessions ()는 AJAX 호출을 수행하고 실패하면 loginForm div를 표시합니다. 사용자가 인증되지 않은 경우 웹 서비스는 403을 반환합니다.

FF 및 IE8에서도 작동하도록 테스트되었습니다.


답변

브라우저가 양식이 로그인 양식임을 감지하지 못할 수 있습니다. 이 이전 질문 에 대한 논의에 따르면 , 브라우저는 다음과 같은 양식 필드를 찾습니다 <input type="password">. 비밀번호 양식 필드가 이와 비슷한 방식으로 구현됩니까?

편집 : 아래 질문에 대답하기 위해 Firefox는 form.elements[n].type == "password"(모든 양식 요소를 반복 하여) 암호 를 감지 한 다음 암호 필드 바로 앞에 텍스트 필드의 양식 요소를 통해 뒤로 검색하여 사용자 이름 필드를 감지 한다고 생각 합니다 (자세한 내용은 여기 ). 내가 알 수 있듯이 귀하의 로그인 양식은 <form>Firefox의 일부 이거나 Firefox가 감지하지 못합니다.




글 탐색

← 이전 글
다음 글 →

최신 글

  • [java] .pem 파일을 읽고 개인 및 공개 키를 얻는 방법
  • [javascript] 페이지의 모든 AJAX 요청에 “후크”추가
  • [android] ListView가 접히지 않고 어떻게 ScrollView에 넣을 수 있습니까?
  • [linux] Apache 서버의 루트 디렉토리를 어떻게 변경합니까? [닫은]
  • [ios] Swift에서 Int를 Hex String으로 변환하는 방법
  • [python] 등급 시스템 기능에서 반복적 인 if-elif 문을 어떻게 단순화 할 수 있습니까?
  • [c#] C #에서 스택 오버플로 예외 포착
  • [windows] Windows의 /usr/local/ssl/openssl.cnf에서 구성 정보를로드 할 수 없습니다
  • [twitter-bootstrap] Bootstrap을 사용하여 모바일에 테이블을 표시하는 방법은 무엇입니까?
  • [windows] BATCH 스크립트에서 무작위로 사용하는 방법은 무엇입니까?

카테고리

태그

.net android angular angularjs arrays asp.net asp.net-mvc bash c c# css database django docker html ios iphone java javascript jquery json linux macos mysql node.js objective-c pandas php postgresql python r reactjs regex ruby ruby-on-rails shell sql sql-server string swift typescript unix visual-studio windows xcode
Copyright © daplus.net - Powered by Naya