https://eastglow.github.io/back-end/2019/08/01/Spring-Interceptor-%EC%82%AC%EC%9A%A9-%EC%8B%9C-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85%EC%9D%B4-%EC%95%88%EB%90%98%EB%8A%94-%EA%B2%BD%EC%9A%B0.html
HandlerInterceptor 를 구현
=====================================================================================================================================================
package com.securus.ciim.main.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean loginCheck =false;
HttpSession session = request.getSession();
if(!StringUtils.isEmpty(session.getAttribute("loginCheck"))){
if(session.getAttribute("loginCheck").equals("success")){
loginCheck = true;
}else{
response.sendRedirect("/");
session.invalidate();
}
}else{
response.sendRedirect("/");
session.invalidate();
}
log.info("#### LoginCheckInterceptor loginCheck : {}",loginCheck );
return loginCheck;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {
}
}
=====================================================================================================================================================
addPathPatterns() 를 통해서 패턴을 추가할 수 있음
excludePathPatterns() 를 통해서 예외 패턴을 추가할 수 있음
excludePathPatterns는 스트링과 리스트를 넣을 수 있음, 리스트의 경우에는 리스트 안에 있는 목록이 전부다 예외처리됨
=====================================================================================================================================================
package com.securus.ciim.configuration;
import com.securus.ciim.main.interceptor.LoginCheckInterceptor;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@AllArgsConstructor
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/user/*")
.addPathPatterns("/log/*")
.excludePathPatterns("/");
}
}
=====================================================================================================================================================
위의 로직과 같이 @Component를 사용하고 인터셉터에서 "LoginCheckInterceptor loginCheckInterceptor" 로 사용하면 잘되지만
new LoginCheckInterceptor 를 해서 사용할 경우 안될수가 있음
그럴때에는 아래와 같이 @Bean 어노테이션을 사용하고, 인터셉터클래스 위에 @Component 어노테이션을 지워주면 됨
registry.addInterceptor(loginCheckInterceptor) 이부분을 아래와같이 사용하면 스프링에서 관리를 하지못해 서비스레이어를 불러오지 못함
registry.addInterceptor(new LoginCheckInterceptor())
@Bean 어노테이션을 사용하여서 LoginCheckInterceptor 를 생성해주는 메소드를 만들고,
상단부에서 전역변수로 선언한 부분을 삭제 ( LoginCheckInterceptor loginCheckInterceptor; ) 이부분
=================================================================================================================
package com.securus.ciim.configuration;
import com.securus.ciim.main.interceptor.LoginCheckInterceptor;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@AllArgsConstructor
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/user/*")
.addPathPatterns("/log/*")
.excludePathPatterns("/");
}
@Bean
public LoginCheckInterceptor loginCheckInterceptor(){
return new LoginCheckInterceptor();
}
}
=================================================================================================================
위의 소스와 똑같지만 @Component 어노테이션을 지움
=====================================================================================================================================================
package com.securus.ciim.main.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean loginCheck =false;
HttpSession session = request.getSession();
if(!StringUtils.isEmpty(session.getAttribute("loginCheck"))){
if(session.getAttribute("loginCheck").equals("success")){
loginCheck = true;
}else{
response.sendRedirect("/");
session.invalidate();
}
}else{
response.sendRedirect("/");
session.invalidate();
}
log.info("#### LoginCheckInterceptor loginCheck : {}",loginCheck );
return loginCheck;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {
}
}
=====================================================================================================================================================
preHandle 메소드에서 response 객체에 상태값을 담아주면 됨
=====================================================================================================================================================
package com.securus.ciim.main.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean loginCheck =false;
HttpSession session = request.getSession();
if(!StringUtils.isEmpty(session.getAttribute("loginCheck"))){
if(session.getAttribute("loginCheck").equals("success")){
loginCheck = true;
}else{
response.sendRedirect("/");
session.invalidate();
}
}else{
response.sendRedirect("/");
session.invalidate();
}
log.info("#### LoginCheckInterceptor loginCheck : {}",loginCheck );
//화면단에 값 리턴
//response.sendError(상태코드,"전달할 문자열");
response.sendError(200,"로그인체크");
//화면단에 값 리턴 종료
return loginCheck;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception arg3) throws Exception {
}
}
=====================================================================================================================================================