새소식

반응형
Java/Spring

HandlerInterceptor

  • -
반응형

- Filter 와 Interceptor의 차이

* Filter : Dispatcher Servlet 앞단에서 정보를 처리하고, Interceptor는 Dispatcher Servlet에서 Controller로 가기전 요청을 가로채서 정보를 처리한다.

- 기능적인 측면으론 완전히 다른 개념이다.

* Interceptor

: 특정 URI로 요청했을 때 컨트롤러로 가는 요청들을 가로챈다.

: Dispatcher Servlet 이 요청을 받아 HandlerMapping을 통해 Controller로 보내는데 Controller로 가기전 Interceptor가 요청을 가로채어 정보를 처리한 후 Controller로 보내진다.

interceptor/JwtInterceptor.java

package com.one.plus.interceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Configuration;

import org.springframework.lang.Nullable;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

@Configuration

public class JwtInterceptor implements HandlerInterceptor {

private Logger logger = LoggerFactory.getLogger(this.getClass());

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

logger.info("[MYTEST] preHandle");

String token = request.getHeader("Authorization");

//String user_id = request.getHeader("Id");

System.out.println("token : "+token);

if(token != null && token.length() > 0) {

Claims c = Jwts.parser()

.setSigningKey("oneplus")

.parseClaimsJws(token)

.getBody();

Date now = new Date();

Date exp = c.getExpiration();

//String jwt_id = c.getId();

if(exp.after(now)) {

System.out.println("로그인 성공");

return true;

}else {

throw new RuntimeException("유효하지 않은 인증 토큰입니다.");

}

}

return false;

System.out.println("preHandle");

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {

logger.info("[MYTEST] postHandle");

System.out.println("postHandle");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {

logger.info("Interceptor > afterCompletion" );

}

}

}

* PreHandle : 지정된 컨트롤러의 동작 이전에 수행할 동작 (사전 제어)

* PostHandle : 지정된 컨트롤러의 동작 이후에 처리할 동작(사후 제어)

Spring MVC의 Dispatcher Servlet이 화면을 처리하기전에 동작(View Resolver를 통해 화면을 그리기전 동작?)

* afterCompletion : Dispatcher Servlet의 화면 처리가 완료된 이후 처리할 동작

config/WebConfig.java

package com.one.plus.config;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.config.annotation.CorsRegistry;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.one.plus.interceptor.JwtInterceptor;

@Configuration

public class WebConfig implements WebMvcConfigurer {

@Autowired

private HandlerInterceptor interceptor;

public void addCorsMappings(CorsRegistry registry) {

registry.addMapping("/**")

.allowedOrigins("*");

}

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new JwtInterceptor())

//addPathPatterns : Interceptor를 할 URL 설정

.addPathPatterns("/plus/**/")

//excludePathPatterns : Interceptor를 무시할 URL

.excludePathPatterns("/plus/login/**/");

}

}

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.