우리가 프로젝트를 만들 때 로그인 기능이 포함되어 있다면 메서드에 하나하나 세션 체크를 해주었을 것이다.
하지만 그럴 경우 코드의 중복이 많아지고 결합도가 높아지는 결과를 얻게된다.
이러한 경우에 InterCeptor를 사용해주면 코드의 중복을 줄이고 결합도가 낮은 코드를 만들 수 있다.
🔽 인터셉터를 하기 위한 방법을 알아보자!
(스프링에 기본적으로 탑재되어 있기 때문에 추가적인 라이브러리가 필요없다.)
0. config(설정) 패키지 → 클래스 만들기
@Configurable 어노테이션 추가alt + shift + s → Override/Implement Methods 에 들어가서 addInterceptors() 를 오버라이드 해준다. @Override
public void addInterceptors(InterceptorRegistry registry) {
List<String>excludeList = new ArrayList<String>();
excludeList.add("/resources/**");//resources 이후 어떤 경로던지
excludeList.add("/member_*"); // member_ 이후 어떤 값이던지
excludeList.add("/checkId.*");
// modelAndView는 리퀘스트를 기반으로 하기 때문에 ajax는 담아서 보낼 수 없어서 예외가 발생했던 것이다.
excludeList.add("/*.ajax"); // ajax 에도 modelAndView를 담아서 보내서 null 예외가 발생함 그래서 이것도 예외로 처리해줌
excludeList.add("/");
// registry 에 언제 어떤 일을 할건지 등록
registry.addInterceptor(checker) // 인터셉터에서 실행할 클래스
.addPathPatterns("/**") // 어떤 패턴의 URL 에 대해서 할것인가?
.excludePathPatterns(excludeList); // 어떤 패턴을 제외시킬것인지?
}
2. utils 패키지 → 클래스 생성
import org.springframework.web.servlet.HandlerInterceptor; 인터페이스를 구현받아준다.import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
// 이 클래스는 인터셉터에서 객체화 해서 쓸래?
//@Autowierd 로 끌어당겨 쓰려면 @Componenet
@Component
public class LoginChecker implements HandlerInterceptor {
Logger logger = LoggerFactory.getLogger(getClass());
// 컨트롤러에 들어가기 전에 체크
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
logger.info("====PRE HANDLER====");
HttpSession session = request.getSession();
if(session.getAttribute("loginId") == null) {
String ctx = request.getContextPath();
logger.info("context path : "+ctx);
response.sendRedirect(ctx);
}
return true;// true : 컨트롤러로 접근/ false : 못가고 그냥 하얀화면
}
// 컨트롤러를 지나 뷰에 가기 전에 체크
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
logger.info("====POST HANDLER====");
HttpSession session = request.getSession();
String msg = "<p>안녕하세요,"+session.getAttribute("loginId")+"님!";
msg += "<a href=\"member_logout.do\" class=\"btn minbtn\">로그아웃</a></p>";
modelAndView.addObject("loginBox", msg);
}
}
🔽 view 에서 사용 예시
<div class="header full">
${loginBox}
</div>