또 잊어버릴까 봐 남기는 인터셉터 사용법!
참고로 적는 경로는 파일의 경로가 아니라 URL 경로를 뜻한다.
1. 인터셉터 처리
인터셉터는 HandlerInterceptor 인터페이스를 통해 구현할 수 있다. 아래처럼 적어주면 된다.
따로 package를 만들어서 interceptor만 관리하고 있다.
아래 코드 를 보면, 처리해 줄 경로가 많아서 따로 메서드처리 해두었다. 이해는 금방 갈 거라 믿고!
유효하지 않은 경로나 사용자는 sendRedirect를 통해 메시지 컨트롤러로 넘겨주었다. 이후 해당 컨트롤러에서 알림을 주어 사용자가 알 수 있도록!
package com.biz.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import com.biz.dto.CompanyVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class AuthorizationInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
CompanyVO member = (CompanyVO) request.getSession().getAttribute("memberInfo");
String requestURI = request.getRequestURI();
// 회원이 아닐 경우, 접근 불가
if (member == null) {
if(isAllowedPath(requestURI)) {
return true;
}
else {
response.sendRedirect("/msg/loginNeeded");
return false;
}
}
// 관리자인 경우, 모든 경로 허용
if (member.getUserLevel() == 0) {
return true;
}
// 관리자가 아닌 경우, 특정 경로만 허용
if (isAllowedPath(requestURI)) {
return true;
}
else {
response.sendRedirect("/msg/authNeeded");
return false;
}
}
// 특정 경로 허용 여부를 판단하는 메소드
private boolean isAllowedPath(String requestURI) {
return requestURI.startsWith("/error") ||
// 프로필 상세 정보 확인 및 수정가능
requestURI.startsWith("/personnel/personnelMyDetail") ||
requestURI.startsWith("/personnel/personnelUpdate") ||
// 중략 ...
requestURI.startsWith("/repair");
}
}
2. 빈 Bean 등록
그 다음으로 사용가능 하도록 구현한 인터셉터 클래스를 빈에 등록해야 한다. 이번엔 WebMvcConfigurer 인터페이스의 도움을 받아 구현할 수 있다! 아래처럼 registry에 인터셉터 클래스를 생성해 준다!
여기서 addPathPatterns("/")이라고 적어준다면, 모든 경로에 Interceptor를 적용시킨다는 의미고,
만약 특정 경로를 제외하고 싶다면 excludePathPatterns에 적어주면 된다. 그럼 해당 경로에서는 interceptor의 영향을 받지 않는다.
package com.biz.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import com.biz.interceptor.AuthorizationInterceptor2;
@Configuration
public class WebMvcConfigurer implements org.springframework.web.servlet.config.annotation.WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(new AuthorizationInterceptor())
// .addPathPatterns("/**"); // 모든 경로에 Interceptor 적용
registry.addInterceptor(new AuthorizationInterceptor2())
.addPathPatterns("/**")
.excludePathPatterns("/", "/index",
"/msg/**", "/assets/**", "/personnel/login", "/personnel/logout");
}
}