혜야의 코딩스토리

[Spring] Interceptor 인터셉터 (로그인 세션 체크 Interceptor로 처리하기) 본문

꿈 : 멋진 개발자 🧸/Java

[Spring] Interceptor 인터셉터 (로그인 세션 체크 Interceptor로 처리하기)

hyeya_ 2022. 10. 4. 20:12

📌 Interceptor(인터셉터) - 요청을 가로채는 작업( 메인 액션 전,후)

매개변수 - HttpServletRequest, HttpServletResponse

용도 - 로그인 처리, pc웹/모바일웹 분기 처리 등

ex) 로그인 세션체크 파일을 각 페이지마다 include하지 않고 인터셉터로 대체하면 좋음

 

📌실행순서

Filter > DispatcherServlet  =>  Interceptor  = >  AOP

Filter(필터) - DispatcherServlet 이전에 실행

 

📌 AOP

@Around  => ProceedingJoinPoint 객체 사용

@Before, @After  => JoinPoint 객체 사용

 

📌 요청형식(파일 등)에 따른 웹서버에서의 처리 

hello.html 통과 hello.jsp => JspServlet hello.do등 html,jsp이외의 모든 요청 => DefaultServlet => DispatcherServlet(스프링)

 

📌 웹서버에서의 요청처리 순서

login.do => Filter =>DispatcherServlet => Interceptor

1) Filter - 선처리만

2) DispatcherServlet

3) Interceptor - url 기반 (전후처리)

4) AOP - 코드에 기반, @Before(전처리), @After(후처리), @Around(전후처리)

 

📌 로그인 세션 체크를 Interceptor으로 처리하기 

💡) 인터셉터는 HandlerInterceptorAdapter라는 추상클래스를 상속받아서

       preHandle, postHandle 메서드를 오버라이딩하여 사용함.

//로그인 전용 인터셉터
public class LoginInterceptor extends HandlerInterceptorAdapter {

	//메인 액션이 실행되기 전 항상 실행되는 선처리 작업
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		//세션 객체 생성
		HttpSession session=request.getSession();
		
		if(session.getAttribute("userid")==null) {//세션이 없으면(로그아웃 상태)
			response.sendRedirect(request.getContextPath()
					+"/member/login.do?message=nologin");//로그인 페이지로 이동
			return false;//메인 액션으로 가지 않고 멈춤(계속 진행x)
		}else {//로그인 상태
			return true;//메인 액션으로 이동(계속 진행O)
		}
	}
	
	//메인 액션이 실행된 후 후처리 작업
	//오버라이딩만 함
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		super.postHandle(request, response, handler, modelAndView);
	}
}

 

💡💡) servlet-context.xml에서 인터셉터 빈 등록 & url mapping처리를 쌍으로 처리한다.

	<!-- 인터셉터 빈을 등록 -->
	<beans:bean id="loginInterceptor" 
	class="com.example.spring02.interceptor.LoginInterceptor">
	</beans:bean>
	
	<!-- 인터셉터 호출을 위한 url mapping -->
	<interceptors>
		<interceptor>
			<mapping path="/shop/cart/list.do" />
			<mapping path="/shop/cart/insert.do" />
			<beans:ref bean="loginInterceptor" />
		</interceptor>
	</interceptors>