- 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/**/");
}
}