2013-07-08 5 views
0

웹 페이지에 로그인하려면이 Jquery Ajax 함수가 있어야합니다.

url="<?php echo Yii::app()->createUrl("security/login") ?>" 

       $.ajax({      
        type:"POST", 
        url:url, 
        data:{}, 
        success: function (jsonResponse) { 
         var json=JSON.parse(jsonResponse); 

         if(json.result == "SUCCESS") 
         { 
          <?php $_SESSION['LOGGED_USER']="USER"; ?> 
         } 

        }, 
        error: function (jqXHR, textStatus, errorThrown) { 
          console.log(errorThrown); 
        }  
       }); 

그리고 내보기에

내가 그것은 "LOGGED NOT"를 인쇄 페이지 처음으로 입력하지만 때 있도록 자동으로 세션을 설정하는 것 같습니다 때 나는이

session_start(); 

if(isset($_SESSION['LOGGED_USER'])) 
{ 
    print_r("LOGGED"); 
} 
else 
{ 
    print_r("NOT LOGGED"); 
} 

이 레이아웃 페이지를 새로 고침하여 "LOGGED"를 인쇄합니다.

내 AJAX 요청에 세션을 올바르게 설정하려면 어떻게해야합니까?

은 대단히 감사합니다 :)

+0

주'그 경우 (json.result == "SUCCESS") { }'$ _SESSION [ 'LOGGED_USER']를 설정하면 그 전에는 아약스 요청을 성공할 수 없습니다. 따라서 처음에는 "NOT LOGGED"가 표시되지만 로그인하면 $ _SESSION [ 'LOGGED_USER']이 (가) 설정됩니다. 그런 다음 페이지를 새로 고치고 "LOGGED"를 봅니다. 희망은 지금 이유가 분명하다 :) – Fallen

+0

@MuhammedHedayet : Umm ... 아니. 서버 구성 방법과 스크립트 위치에 따라 PHP 부분에서 구문 오류가 발생하거나 스크립트가로드되는 즉시 실행됩니다. – cHao

+0

답장을 보내 주셔서 감사합니다. 내 스크립트가 내 컨트롤러가 세션 변수를 설정하고 완벽하게 작동합니다. :) –

답변

0

이 아약스에 올 때 많은 사람들이 서버 대 클라이언트에 대해 혼란스러워 보인다.

  • JS는 브라우저 (클라이언트)에서 실행됩니다. PHP가 서버에서 실행됩니다. 두 언어는 완전히 다른 기계에서 실행되는 다른 언어입니다. 그들은 동일한 변수 또는 다른 것을 공유하지 않습니다. 그들은 서로에게 직접 말하거나 서로에 대해 아무 것도 모릅니다. 그들의 유일한 의사 소통 수단은 HTTP 요청을 통한 것입니다. (음, WebSockets도 있습니다 ... 아직 조금 고급입니다.)

  • JS와 PHP는 일반적으로 동시에 실행되지 않습니다. 설정에 따라이 스크립트가 어디에 저장되는지에 따라 두 가지 중 하나가 발생합니다.이 경우 어느 쪽도 원하는 작업이 아닙니다.

    • JS는 서버가 PHP에 공급하지 않는 파일 형식입니다. 브라우저가 파일을 볼 때 PHP 코드가 파일에 남아 있으며 잘못된 JS로 인해 실행하려고하면 구문 오류가 발생합니다. 아마 Ajax 게시를하기도 전에 아마.

    • JS는 서버에 파일을 입력하고 PHP에을 입력합니다. PHP 인터프리터는 충실히 파일을 검토하고 그 안에있는 모든 PHP 코드를 찾아 파싱하고 실행합니다. PHP 코드는 서버에서 실행됩니다. 브라우저에 페이지가 전송되기 전에 가능합니다. (그리고 PHP는 JS를 말하는 것이 아니므로 생성되는 것이 유효한 HTML인지 JS인지는 상관하지 않습니다. 페이지의 비 PHP 코드는 무의미합니다.) 어쨌든 브라우저가 스크립트를 실행할 때까지 위는 다음과 같습니다

      ... 
           success: function (jsonResponse) { 
            var json=JSON.parse(jsonResponse); 
      
            if(json.result == "SUCCESS") 
            { 
             } 
      
           }, 
      ... 
      

    를 PHP가 이미 파일을 통해 사라와 $_SESSION['LOGGED_USER'] 설정에 대한 비트를 해석 때문에. 사용자가 활성 세션을 가지고 있거나 로그인했는지 여부를 결정하면 해당 LOGGED_USER 변수는 브라우저가 해당 페이지를 요청한 두 번째 세션으로 설정됩니다.

security/login에 대한 요청을 처리 년대 PHP 스크립트는 세션 변수를 설정해야합니다. 세션 데이터가 전체적으로 서버 측이므로 JS는이를 수행 할 수 없으며 브라우저를 방금 시작하고 대규모 보안 구멍을 열지 않고 임의의 PHP 코드를 실행하도록 서버에 지시 할 수 없습니다. (브라우저가 "이봐, PHP, 이걸"라고 말할 수 있다면 어떻게 될지 그림을 들어라 .JS 콘솔을 띄우고, 어떻게하는지보고 ... 적어도 나는 콘솔에 JS 행을 써서 로그인 여부와 관계없이 해당 변수를 설정할 수 있습니다.)

또는 실제로 원한다면 JS가 게시하고 세션 데이터를 설정하는 다른 페이지를 만들 수 있습니다 .그것은 낭비로 보입니다 ... 그리고 안전하게하는 것은 꽤 어려울 수 있습니다. (PHP가 이미 로그인했다는 것을 알지 못하면 재 인증을 받아야합니다.) 어떤 이유로 든 security/login을 수정할 수 없다면 고려하지 않을 것입니다.

+0

정말 선생님, 정말로 좋은 설명이었습니다. 감사합니다. –