2017-11-23 12 views
0

나는 오랫동안 아래 문제로 고심하고있다.
다음은 필수 세부 정보입니다.
언어 : PHP
프레임 워크 : Codeignitor
도서관 : 관리자 패널의 경우, 우리는 존경받는 레코드를 나열하는 Datatable.js을 사용하고 있습니다 : 문제가Datatable JS를 사용하여 PHP 세션 관리를 처리하는 방법

Datatable.js (클라이언트 측) . 따라서 세션이 만료 된 동안 몇 페이지가 열리면 다음 오류 (첨부 된 이미지)가 표시됩니다. 참고 : 페이지를 새로 고침하면 내 관리자 로그인 페이지로 리디렉션되지만 페이지를 새로 고치지 않고도 해결책이 필요합니다. enter image description here

이 설명이 문제를 해결하는 데 도움이되기를 바랍니다. 미리 감사드립니다. :)

+0

이유도 AJAX와 세션을 사용합니까? 내게는 막대한 오버 헤드가되는 것 같다. – davidkonrad

+0

@davidkonrad는 관리자 패널이 아약스를 사용하지 않아야 함을 의미합니까? admin = logged in = sessions – Alex

+0

@Alex 아니요, 스크립트의 세션을 피하십시오. 차단을 막기 위해 어쨌든 닫아야 할 컨텐트를 전달하는 AJAX 스크립트에서'start_session()'의 이점을 볼 수 없습니다. 리퍼러에 액세스 할 수 있고, 요청에 티켓을 추가 할 수 있으며, 크로스 도메인 액세스 등을 방지 할 수 있습니다. – davidkonrad

답변

0

내가보기에 당신이 페이지에 있고 세션이 만료되고 사용자가 Ajax로 어떤 것을 요청하면 요청 된 페이지가 로그인 페이지로 리디렉션된다는 것입니다. 따라서 네트워크 트래픽과 요청한 작업을 보면 리디렉션 된 페이지가 표시되고 유효한 Json 응답이 아니므로 오류가 발생합니다.

나는 내 사이트에서 비슷한 점을 가지고 있습니다. 기본적으로 사용자가 로그인해야하는 모든 페이지는 사용자가 로그인하여 페이지를 볼 수 있는지 확인하는 기능으로 보호됩니다. 그렇지 않으면 두 가지 중 하나가 발생합니다. 사용자가 리디렉션됩니다. 요청 유형이 Ajax 인 경우 Json 오류를 구문 분석합니다.

내가 제안한 것과 비슷한 것을 채택하는 것이 좋습니다. 참고로 연속성을 유지하는 것이 중요합니다. PHP와 JS 스크립트에서 Ajax 오류를 구문 분석 할 때 PHP에서 동일한 응답 형식을 사용하는 것이 중요합니다.

예 :

public function protect($allowed = array()) 
{ 
    $uri = uri_string(); 
    // user isn't logged in 
    if (!$this->ion_auth->logged_in()) { 
     if ($this->input->is_ajax_request()) { 
      encode_response('error', $this->lang->line('login_expired')); 
     } elseif ($uri == rtrim($this->success_login_redirect, '/')) { 
      redirect(CMS_DIR_NAME . '/login'); 
     } else { 
      $this->session->set_userdata('login_redirect', '/' . $uri); 
      redirect(CMS_DIR_NAME . '/login'); 
     } 
    } 
    $this->session->unset_userdata('login_redirect'); 
    if (!$this->ion_auth->is_admin() && !$this->ion_auth->in_group($allowed, $this->curr_user->id())) { 
     if (!$this->is_user_allowed($this->curr_user->group()->name)) { 
      show_error($this->lang->line('messages_page_access'), 403, 'Error'); 
     } 
    } 
} 
+0

입력 해 주셔서 감사합니다 @alex Ajax 호출의 특정 메시지를 구문 분석하여이를 기반으로 PHP 스크립트를 사용하여 로그인 페이지로 리디렉션해야합니다. 그래? –

+0

예제를 사용하여 답변을 업데이트했습니다. 기본적으로 protect()는 모든 컨트롤러의 __construct()에서 호출됩니다. 세션이 만료 된 후 모든 ajax 요청은 create 및 json_encoded 오류를 생성합니다. 내 js에서 나는 단순히 오류가 있는지 확인하고 오류 메시지를 구문 분석하고 귀하의 경우에는 datatable을 렌더링하지 마십시오? 그게 더 명확 해? 물론 'session_expired'라는 특정 오류를 호출하고이를 기반으로 js에서 페이지를 새로 고칠 수 있지만이 방법은 ajax를 사용하는 모든 js 함수가 encode_response를 읽고 오류 만 표시하기 때문에 수행합니다. – Alex