Session을 이용한 로그인 처리~~~!! 

내부에서만 사용하거나 단순한 사이트로 굳이 Security 까지 추가할 필요가 없는 경우 사용하면 좋겠다. 

 

프로세스는 ~~~ 

모든 요청을 감시하는 Interceptor 생성! 

로그인에 성공하면 Session값을 설정하고 

요청이 올때마다 Interceptor가 Session 값이 있는지 확인 후 없다면 로그인페이지로 리턴시키걸로~ 

 

즈아~~ 시작! 

 

1.  Interceptor 생성 
요청이 들어오면 Session 지정해둔 Session 값을 확인하고 없다면 로그인페이지로 리다이렉트 처리한다. 

public class LoginInterceptor extends HandlerInterceptorAdapter {
	private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		if( request.getSession().getAttribute(Consts.AUTHORIZED) == null  ) {
			response.sendRedirect(request.getContextPath() +"/login");
			return false;
		}
		return true;
	}
}

 

2. Interceptor 등록! 
모든 요청을 검사하도록  .addPathPatterns("/**") 로 설정 후 
Js, css 파일 등이 들어있는 resource 디렉토리 하위는 무시하도록 exclude 처리한다. 
로그인을 위한 요청도 exclude 처리~~!! 

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter  {
	
	 @Override
	    public void addInterceptors(InterceptorRegistry registry) {
	        registry.addInterceptor(new LoginInterceptor())
	                .addPathPatterns("/**")
	                .excludePathPatterns("/resources/**")
	                .excludePathPatterns("/login/**"); 
	    }
	 
}

 

 

3. Login/out 세션작업~~!! 

(위치는 각자 로그인/아웃 파일에 작성!)

// Login 
// 비밀번호, 잠금여부 등등 모든 조건이 맞아 로그인에 성공하게되면 Session 값을 추가해준다. 
request.getSession().setAttribute(Consts.AUTHORIZED, Consts.AUTHORIZED_VALUE);

// Logout
// 로그아웃시 Session 값을 제거해준다. 
request.getSession().removeAttribute(Consts.AUTHORIZED); 

 

4. Session 시간 설정~ 

초단위 결과를 안쓰고 굳이 (60 * 60 * 24)로 쓴 이유는~ 보고 바로 알수있게 하기 위함~~

 시간 같은건 이렇게 해주면 같이 일하는 사람 편하겠죠?  ( 암산이 빠르면 필요없겠지만.. 나는 좋음.. ^^! ) 

public class SessionListener  implements HttpSessionListener{

	@Override
	public void sessionCreated(HttpSessionEvent session) {
		session.getSession().setMaxInactiveInterval(60 * 60 * 24);// 24 시간으로 설정
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
	}

}

 

 

Session 만료되면 자동으로 로그인페이지로 보내볼까??? 

시간 설정할때 보니 아래 있는 sessionDestroyed가 Session이 만료되면 호출된다고한다. 

요고요고 ~ ↓ 


	@Override
	public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
		 HttpSession session = httpSessionEvent.getSession();
		
	}


음~~

그럼 여기서 로그인 페이지로 redirect해주면 되겠군! 하고 생각할 수 있다. 

자~! 여기서 생각해봐야할건 

sessionDestroyed 메소드는 사용자의 요청으로 호출되는게 아니라

Session이 만료되었을때 호출 된다는 것이다. 

즉 ~ R e q u e s t 가 없 다 는 뜻 ! !  

요청(request)이 없으니 redirect 할곳도 없습니다~ ~!

혹시~~~~ redirect 처리한다고 시간낭비하지 않기로 ..  ^^ 

 

보통 Session 만료 검사를 Interceptor에서 필터링으로 처리하는데 

우린 이미 interceptor 처리하고있으니~ 추가안해도 될듯

 

그래도~~~!! 

Session 만료되기 전 뭔가 알림을  설정하고자 한다면 

스크립트단에서 

setInterval 같은 함수를 이용해 10분 간격으로 체크!~

이벤트가 생기면 체크값을 초기화~ 이벤드가 없어서 5번째까지 온다면 

"세션이 10분 남았음"  표기를 해주는것도 방법일 듯 하다. ~ 

 

uri로 영문, 국문 페이지를 구분하는 사이트를 운영하게 되었다.. 

(controller 자체가 국문용, 영문용 따로 생성되어있는.. )

이렇게 되어있다보니 요청한 url에 따라 영/국문 페이지는 잘 나오지만

페이지내 locale 설정값을 통해 나오는 문자와 이미지가 제대로 나오지 않는 이슈가 있었다~ 

예) 로케일이 국문으로 되어있는데 영문 url를 치고 들어오면 국문용 이미지가 출력됨.. ;; 

애초에 로케일 값만 가지고 구축했으면 좋았겠지만 안되어있으니 아쉬운대로 나는 작업을 이어간다.

예전엔 이런걸 보면 왜이렇게 해두는거지??? 했지만 이젠 다 사정이 있겠거니 하는 마음이 든다..ㅎㅎ; 왜지? 

 

무튼 

hook으로 controller 들어가기 전에 uri 값을 읽어와서 locale 설정을 변경해주는 방향으로 작업하려고 한다. 

 

시작! 

1. application/config/config.php 에 들어가서 아래값을 true로 설정한다. hooks 활성화 해주는거~ 

$config['enable_hooks'] = true;

 

2. application/config/hooks.php 사용할 hooks 선언을 해준다. 

$hook['post_controller_constructor'] = array(
	'class'    => 'Locale_init', // 클래스명, 그냥 파일명이라고 생각해도 될듯 
	'function' => 'inits', // 그안에 내가 쓸 함수명 
	'filename' => 'Locale_init.php', // 실제 파일명 
	'filepath' => 'hooks' // 저장된 경로이니 특별하지 않다면 그냥 두기 
);

$hook[''] 에 들어가는 값은 여러가지 타입이 있는데 내 사용용도에 맞게 적어주면 된다. 

나는 컨트롤러가 인스턴스화 된 직후 진행하려고 post_controller_constructor로 설정했다.

pre_system 
 - 시스템 작동초기입니다.벤치마크와 후킹클래스들만 로드된 상태로서, 라우팅을 비롯한 어떤 다른 프로세스도 진행되지않은 상태.
pre_controller 
- 컨트롤러가 호출되기 직전. 모든 기반클래스(base classes), 라우팅 그리고 보안점검이 완료된 상태.
post_controller_constructor 
 - 컨트롤러가 인스턴스화 된 직후. 사용준비가 완료된 상태. 하지만, 인스턴스화 된 후 메소드들이 호출되기 직전.
post_controller
-  컨트롤러가 완전히 수행된 직후.
display_override
-  _display() 함수를 재정의. 최종적으로 브라우저에 페이지를 전송할 때 사용됩니다. 이로서 당신만의 표시 방법( display methodology)을사용할 수 있음. 
   주의 : CI 부모객체(superobject)를 $this->CI =& get_instance() 로 호출하여 사용한 후에 최종데이터 작성은 $this->CI->output->get_output() 함수를 호출하여 할 수 있음

cache_override 
- 출력라이브러리(Output Library) 에 있는 _display_cache() 함수 대신 당신의 스크립트를 호출할 수 있도록 해줌. 
  이로서 당신만의 캐시 표시 메커니즘(cache display mechanism)을 적용할 수 있음
post_system 
- 최종 렌더링 페이지가 브라우저로 보내진후에 호출

 

3. application/config/configLocale_init.php

파일을 생성하고 원하는 작업을 코딩한다. 

<?php
defined('BASEPATH') OR exit('No direct script access allowed');


class Locale_init  {
    private $CI;
 
    function __construct()
    {
        $this->CI =& get_instance();
 
        if(!isset($this->CI->session)){  //Check if session lib is loaded or not
              $this->CI->load->library('session');  //If not loaded, then load it here
        }
    }
 
 
    public function inits(){
     
        $CI =& get_instance();
        $CI->load->library('session');   
        $uri= $_SERVER['REQUEST_URI']; //uri를 구합니다.
	
		
		$pieces = explode('/', $uri);
		
		if(isset( $pieces ) && count($pieces) > 1) { 
			$this->CI->session->set_userdata("__ss_lan", $pieces[1] );
			$lan = $this->CI->session->userdata("__ss_lan");
		}
		
    }
}

 

 

이제 실행해보면 잘된당~~ 

 

* 저는 php 개발자는 아니지만.. 임시적으로 운영중이니 코드에 이슈가 있다면 코멘트 남겨주세요! 

배우는 것을 좋아합니다~~~!! 

 

'PHP' 카테고리의 다른 글

PHP Codeigniter 쿼리 찍어보기  (0) 2021.02.22

+ Recent posts