CI 세션 처리 문제

CodeIgniter는 세션을 PHP session을 사용하지 않고 자체적으로 쿠키를 구워서 사용하고 있는데,
자동로그인 같이 기존의 expire타임과 다르게 처리를 하려면 자체 라이브러리를 고치지 않으면 불가능 하다.

페이지를 읽을 때마다 매번 쿠키데이터를 검증하고/업데이트 할때 config.php안에 있는 sess_expiration 을 참조하기 때문에 처음에 expire 시간을 다르게 설정하더라도,
업데이트 할때 다시 config안에 데이터러 덮어쓰는 상황이 발생한다.

결국 libraries/session.php 파일을 조금 수정해서 해결.
set_userdata로 값을 넣을때 expire란 항목을 추가해서 넣고 이 값이 있으면 아래처럼 sess_update와 sess_read 부분에서 처리하도록 수정했다.

//sess_read
if ((($session[‘last_activity’] + $this->sess_expiration) < $this->now) && (!isset($session[‘expire’]) || $session[‘expire’] > 0 ))

//sess_update
if ((($this->userdata[‘last_activity’] + $this->sess_time_to_update) >= $this->now) ||
(isset($this->userdata[‘expire’]) && $this->userdata[‘expire’] == 0 ) )

Tags:

Comments

GAE 쿠키 처리

오늘 하루종일 애를 먹었던 쿠키 처리.

세션으로 하는것이 까탈스러워보이는데다가 로그인 정보중에 별로 중요한것도 담지 않을 것 같아서 쿠키로만 처리하려고 했는데 생각보다 처리가 어려웠던...T_T

일단 따로 클래스를 분리해서 간단한 MVC형식으로 가져가다 보니 requestHandler에서 처리하는것이 아니라 별도의 클래스에서 처리하도록 하는 바람에 일이 좀더 커졌다.

간단하게
쿠키를 구울 데이터를 배열로 저장하고,
배열을 pickle.dumps를 이용해서 serialize한 다음,
다시 문자열이 중간에 깨지지 않도록 base64인코딩을 해서,
http header에다가 Set-Cookie로 구우면 성공!

cookielib을 이용할 수도 있지만 domain이나 path까지 설정해야하는 데다가 헤더에 붙이나 cookielib을 하나 값이 이상하게 깨지는 문제가 있어서 일단은 하나의 문자열로 처리한 다음에
서버쪽에서 데이터를 받아서 다시 계산하는 것으로 바꾸니 깔끔하게 잘된다.

디코딩은
self.request.cookies[name]의 데이터를 base64 디코딩,
pickle.loads로 다시 오브젝트로 만들고,
쿠키 클래스를 init할 때 집어넣고 필요할때마다 쓰기!

Tags:

Comments

GAE 로컬테스트에서 sqlite에러가 날때

dev_appserver.py를 실행해서 로컬에 테스트 서버를 올려서 테스트 하려고 하는데 자꾸 에러가 나는 상황이 발생해서 로그를 보니 sqlite관련 rdbms파일을 핸들링 할 수가 없어서 생기는 문제.

원인은 windows7의 경우 사용자 폴더내의 appdata/local/temp폴더안에 rdbms 파일을 만드는데, 이때 사용자 명이 한글이면 유니코드로 바꾸다가 폴더를 못찾는 문제가 발생한다

dev_appserver.py를 실행할 때—rdbms_sqlite_path 옵션을 붙여서 파일을 다른곳에다 저장하게 하면 해결되는 문제

Tags:

Comments

« Previous entries · Next entries »