-
로그인 하지 않은 상태에서 사용자의 정보(이름, 비밀번호 등)를 바꾸려고 할 때, 세션에서 커맨드 객체 검사하는 코드 추가
-
HandlerInterceptor 인터페이스 구현
-
HandlerInterceptor 사용 시 넣을 수 있는 시점
-
3가지 시점을 처리하기 위한 HandlerInterceptor 의 메서드 정의
-
HandlerInterceptor 실행흐름
-
비밀번호 변경 기능에 HandlerInterceptor 사용 예
-
HandlerInterceptor 설정 (WebMvcConfigurer를 상속받은 설정클래스에 빈 및 addInterceptors 메서드 재정의)
-
Ant 경로 패턴
-
addPathPatterns() 메서드에 지정한 경로 패턴 중 일부 제외 : excludePath Patterns() 메서드
로그인 하지 않은 상태에서 사용자의 정보(이름, 비밀번호 등)를 바꾸려고 할 때, 세션에서 커맨드 객체 검사하는 코드 추가
@GetMapping
public String form(@ModelAttribute("command") ChangePwdCommand pwdCmd, HttpSession session) {
AuthInfo authInfo = (AuthInfo) session.getAttribute("authInfo");
return authInfo == null ? "redirect:/login" : "edit/changePwdForm";
}
실제 웹 어플리케이션에서는 위와 같이 비밀번호 변경 기능 외에 더 많은 기능에 로그인 여부를 확인해야하고, 코드 중복이 발생한다.
이렇게 다수의 컨트롤러에 대해 동일한 기능을 적용해야할 때 사용하는 것이 HandlerInterceptor이다.
HandlerInterceptor 인터페이스 구현
org.springframework.web.HandlerInterceptor 인터페이스
HandlerInterceptor 사용 시 넣을 수 있는 시점
- 컨트롤러(핸들러) 실행 전
- 컨트롤러(핸들러) 실행 후, 아직 뷰를 실행하기 전
- 뷰를 실행한 이후
3가지 시점을 처리하기 위한 HandlerInterceptor 의 메서드 정의
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
preHandle() 메서드
- 컨트롤러(핸들러) 객체를 실행하기 전에 필요한 기능 구현할 때 사용
- handler 파라미터는 웹 요청을 처리할 컨트롤러(핸들러)객체
- 로그인하지 않은 경우 컨트롤러 실행하지 않음
- 컨트롤러를 실행하기 전에 컨트롤러에서 필요로 하는 정보 생성
- false 값을 리턴하면 컨트롤러 또는 다음 HandlerInterceptor를 실행하지 않는다.
postHandle() 메서드
- 컨트롤러(핸들러)가 정상적으로 실행된 이후 추가 기능을 구현할 때 사용
- 컨트롤러가 익셉션을 발생하면 postHandle() 메서드는 실행하지 않음
afterCompletion() 메서드
- 뷰가 클라이언트에 응답 전송 뒤 실행
- 컨트롤러 실행 과정에서 익셉션이 발생하면 이 메서드의 네 번째 파라미터로 전달
- 익셉션이 발생하지 않으면 네 번째 파라미터는 null
- 컨트롤러 실행 이후 예기치 않게 발생한 익셉션을 로그로 남긴다거나 실행 시간을 기록하는 등의 후처리를 하는데 적합
HandlerInterceptor 실행흐름

HandlerInterceptor 인터페이스의 각 메서드는 아무 기능도 구현하지 않은 자바8의 디폴트 메서드
해당 인터페이스 상속받고 피룡한 메서드만 재정의
비밀번호 변경 기능에 HandlerInterceptor 사용 예
package interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
public class AuthCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession(false);
if (session != null) {
//세션에 authInfo 객체가 존재하면 true 리턴
Object authInfo = session.getAttribute("authInfo");
if (authInfo != null) {
return true;
}
}
//login 페이지로 리다이렉트 후 false리턴, 컨트롤러 실행 하지 않음.
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
}
request.getContextPath() : 현재 컨텍스트 경로 리턴
http://localhost:8080/sp5-chap13 일때 경로 : /sp5-chap13
/sp5-chap13/login으로 리다이렉트
HandlerInterceptor 설정 (WebMvcConfigurer를 상속받은 설정클래스에 빈 및 addInterceptors 메서드 재정의)
//인터셉터 설정 메서드
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authCheckInterceptor())
.addPathPatterns("/edit/**"); //Ant 경로 패턴 /edit/로 시작하는 모든 경로에 인터셉터 적용
}
//인터셉터 객체 빈 등록
@Bean
public AuthCheckInterceptor authCheckInterceptor() {
return new AuthCheckInterceptor();
}
Ant 경로 패턴
세 가지 특수 문자를 이용하여 경로 표현
- [*] : 0개 또는 그 이상의 글자
- [?] : 1개 글자
- [**] : 0개 또는 그 이상의 폴더 경로
예)
@RequestMapping("/member/?*.info") /member/로 시작하고 확장자가 .info로 끝나는 모든 경로
@RequestMapping("/faq/f?OO.fq") /faq/f로 시작하고 1글자가 사이에 위치하고 00.fq로 끝나는 모든 경로
@RequestMapping("/folders/**/files") /folders/로 시작, 중간에 0개 이상의 중간 경로가 존재하고 /file 로 끝나는 모든 경로,
/folders/files, /folders/1/2/3/files
addPathPatterns() 메서드에 지정한 경로 패턴 중 일부 제외 : excludePath Patterns() 메서드
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authCheckInterceptor())
.addPathPatterns("/edit/**")
.excludePathPatterns("/edit/help/**"); // /edit/help/로 끝나는 것은 제외
}
'Spring' 카테고리의 다른 글
[Spring] @DateTimeFormat 변환 처리 (0) | 2024.05.29 |
---|---|
[Spring] 쿠키 사용하기 (0) | 2024.05.25 |
[Spring] HttpSession 사용해보기 (0) | 2024.05.20 |
[Spring] Bean Validation 검증 (0) | 2024.05.18 |
[Spring] 컨트롤러 범위 Validator @InitBinder (0) | 2024.05.18 |
로그인 하지 않은 상태에서 사용자의 정보(이름, 비밀번호 등)를 바꾸려고 할 때, 세션에서 커맨드 객체 검사하는 코드 추가
@GetMapping
public String form(@ModelAttribute("command") ChangePwdCommand pwdCmd, HttpSession session) {
AuthInfo authInfo = (AuthInfo) session.getAttribute("authInfo");
return authInfo == null ? "redirect:/login" : "edit/changePwdForm";
}
실제 웹 어플리케이션에서는 위와 같이 비밀번호 변경 기능 외에 더 많은 기능에 로그인 여부를 확인해야하고, 코드 중복이 발생한다.
이렇게 다수의 컨트롤러에 대해 동일한 기능을 적용해야할 때 사용하는 것이 HandlerInterceptor이다.
HandlerInterceptor 인터페이스 구현
org.springframework.web.HandlerInterceptor 인터페이스
HandlerInterceptor 사용 시 넣을 수 있는 시점
- 컨트롤러(핸들러) 실행 전
- 컨트롤러(핸들러) 실행 후, 아직 뷰를 실행하기 전
- 뷰를 실행한 이후
3가지 시점을 처리하기 위한 HandlerInterceptor 의 메서드 정의
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
preHandle() 메서드
- 컨트롤러(핸들러) 객체를 실행하기 전에 필요한 기능 구현할 때 사용
- handler 파라미터는 웹 요청을 처리할 컨트롤러(핸들러)객체
- 로그인하지 않은 경우 컨트롤러 실행하지 않음
- 컨트롤러를 실행하기 전에 컨트롤러에서 필요로 하는 정보 생성
- false 값을 리턴하면 컨트롤러 또는 다음 HandlerInterceptor를 실행하지 않는다.
postHandle() 메서드
- 컨트롤러(핸들러)가 정상적으로 실행된 이후 추가 기능을 구현할 때 사용
- 컨트롤러가 익셉션을 발생하면 postHandle() 메서드는 실행하지 않음
afterCompletion() 메서드
- 뷰가 클라이언트에 응답 전송 뒤 실행
- 컨트롤러 실행 과정에서 익셉션이 발생하면 이 메서드의 네 번째 파라미터로 전달
- 익셉션이 발생하지 않으면 네 번째 파라미터는 null
- 컨트롤러 실행 이후 예기치 않게 발생한 익셉션을 로그로 남긴다거나 실행 시간을 기록하는 등의 후처리를 하는데 적합
HandlerInterceptor 실행흐름

HandlerInterceptor 인터페이스의 각 메서드는 아무 기능도 구현하지 않은 자바8의 디폴트 메서드
해당 인터페이스 상속받고 피룡한 메서드만 재정의
비밀번호 변경 기능에 HandlerInterceptor 사용 예
package interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
public class AuthCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession(false);
if (session != null) {
//세션에 authInfo 객체가 존재하면 true 리턴
Object authInfo = session.getAttribute("authInfo");
if (authInfo != null) {
return true;
}
}
//login 페이지로 리다이렉트 후 false리턴, 컨트롤러 실행 하지 않음.
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
}
request.getContextPath() : 현재 컨텍스트 경로 리턴
http://localhost:8080/sp5-chap13 일때 경로 : /sp5-chap13
/sp5-chap13/login으로 리다이렉트
HandlerInterceptor 설정 (WebMvcConfigurer를 상속받은 설정클래스에 빈 및 addInterceptors 메서드 재정의)
//인터셉터 설정 메서드
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authCheckInterceptor())
.addPathPatterns("/edit/**"); //Ant 경로 패턴 /edit/로 시작하는 모든 경로에 인터셉터 적용
}
//인터셉터 객체 빈 등록
@Bean
public AuthCheckInterceptor authCheckInterceptor() {
return new AuthCheckInterceptor();
}
Ant 경로 패턴
세 가지 특수 문자를 이용하여 경로 표현
- [*] : 0개 또는 그 이상의 글자
- [?] : 1개 글자
- [**] : 0개 또는 그 이상의 폴더 경로
예)
@RequestMapping("/member/?*.info") /member/로 시작하고 확장자가 .info로 끝나는 모든 경로
@RequestMapping("/faq/f?OO.fq") /faq/f로 시작하고 1글자가 사이에 위치하고 00.fq로 끝나는 모든 경로
@RequestMapping("/folders/**/files") /folders/로 시작, 중간에 0개 이상의 중간 경로가 존재하고 /file 로 끝나는 모든 경로,
/folders/files, /folders/1/2/3/files
addPathPatterns() 메서드에 지정한 경로 패턴 중 일부 제외 : excludePath Patterns() 메서드
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authCheckInterceptor())
.addPathPatterns("/edit/**")
.excludePathPatterns("/edit/help/**"); // /edit/help/로 끝나는 것은 제외
}
'Spring' 카테고리의 다른 글
[Spring] @DateTimeFormat 변환 처리 (0) | 2024.05.29 |
---|---|
[Spring] 쿠키 사용하기 (0) | 2024.05.25 |
[Spring] HttpSession 사용해보기 (0) | 2024.05.20 |
[Spring] Bean Validation 검증 (0) | 2024.05.18 |
[Spring] 컨트롤러 범위 Validator @InitBinder (0) | 2024.05.18 |