19-회원제 게시판 만들기_SpringBoot와 JPA
인터셉터(interceptor) - SpringBoot
[인터셉터(interceptor)]
[인터셉터(interceptor)기능 추가하기]
인터셉터(interceptor) 기능은 로그인 하지 않은 회원이 예를 들어 글쓰기 링크를 클릭하는 경우
글쓰기 페이지로 가는 명령을 가로채서 login 페이지를 먼저 보여주어
관리자가 허용하는 일부의 메뉴를 제외하고는 모두 로그인 후 사용토록 강제하는 기능이다.
실제 기능은 아래 동영상을 참고하면 된다.
※ Interceptor란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를
가로채는 역할을 한다.
먼저 interceptor package를 생성하고 거기에 LoginCheckInterceptor를 class 형태로 생성하여
아래와 같이 코딩한다.
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
// @Override: 부모가 가진 메서드를 재정의 함
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
// 사용자가 요청한 주소
String requestURI = request.getRequestURI();
System.out.println("requestURI = " + requestURI);
// 세션 가져옴
HttpSession session = request.getSession();
// 세센에 로그인 정보가 있는지 확인(session도 request 객체안에 들어있는 것)
if(session.getAttribute(SessionConst.LOGIN_EMAIL) == null) {
// session에 값이 있으면 로그인한 상태를 의미
// 위 if문에 해당하는 건은 미로그인 상태를 의미
// 로그인을 하지 않은 경우 바로 로그인페이지로 보냄.
// 로그인 후 로그인 직전 페이지를 보여준다.
session.setAttribute("redirectURL", requestURI);
response.sendRedirect("/member/login");
// 사용자가 요구한 주소값을 가지고 감.
// MemberController loginForm 메서드를 일부 수정해야 함.
return false;
} else {
// 여기는 로그인 한 상태를 의미
return true;
}
}
}
common package에 거기에 SessionConst를 class 형태로 생성하여
아래와 같이 코딩한다. 이렇게 하는 이유는 오타방지를 위해 상수를 선언하기 위함이다.
public class SessionConst {
public static final String LOGIN_EMAIL = "loginEmail";
// static과 final이 붙고 대문자면 상수 선언
}
또한 interceptor package에 WebConfig를 class 형태로 생성하여 아래와 같이 코딩한다.
// @Configuration: 설정정보를 스프링 실행 시 등록해 줌.
// interceptor를 사용하지 않고 싶을때는 @Configuration의 주석처리만으로 가능.
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 로그인 여부에 따른 접속가능, 불가능 페이지 구분.
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor())
// 만든 LoginCheckInterceptor 클래스 내용을 넘김
.order(1) // 해당 인터셉터가 적용되는 순서(우선순위)
.addPathPatterns("/**") // 해당 프로젝트의 모든 주소에 대해 인터셉터를 적용
.excludePathPatterns("/", "/member/save", "/member/login", "/member/logout", "/css/**");
// 제외 할 주소(ex. 회원가입, 메인페이지 등)
}
}
마지막으로 MemberController에 Login 처리를 위한 메서드를 아래와 같이 수정한다.
// 로그인 처리 with Interceptor
@PostMapping("/login")
public String login(@ModelAttribute("login") MemberLoginDTO memberLoginDTO, Model model, HttpSession session) {
boolean loginResult = ms.login(memberLoginDTO);
if (loginResult) {
session.setAttribute("loginEmail", memberLoginDTO.getMemberEmail());
String redirectURL = (String) session.getAttribute("redirectURL");
if (redirectURL != null) {
return "redirect:" + redirectURL;
} else {
return "redirect:/";
}
} else {
model.addAttribute("message", "로그인 정보가 잘못되었습니다.");
model.addAttribute("searchUrl", "/member/login");
return "member/message";
}
}
댓글남기기