
/* Filter : 요청, 응답 시 걸러내거나 추가할 수 있는 객체
*
* [필터 클래스 생성 방법]
* 1. jakarta.servlet.Filter 인터페이스 상속 받기
* 2. doFilter() 메서드 오버라이딩
*/
// 로그인이 되어 있지 않은 경우 특정 페이지로 돌아가게함
public class LoginFilter implements Filter {
// 필터 동작을 정의하는 메서드
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// ServletRequest : HttpServletRequest의 부모 타입
// ServletResponse : HttpServletResponse의 부모 타입
// HTTP 통신이 가능한 형태로 다운 캐스팅
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse) response;
// Session 얻어오기
HttpSession session = req.getSession();
// 세션에서 로그인한 회원 정보를 얻어오기
// 얻어왔으나, 없을 때 -> 로그인이 되어있지 않은 상태
if(session.getAttribute("loginMember") == null) {
// /loginError 컨트롤러로 재요청
// resp를 이용해서 원하는 곳으로 리다이렉트
resp.sendRedirect("/loginError");
} else {
// 로그인이 되어 있는 경우
// FilterChain
// - 다음 필터 또는 Dispatcher Servlet과 연결된 객체
// 다음 필터로 요청/응답 객체 전달
// 만약 없으면 Dispatcher Servlet으로 전달)
chain.doFilter(request, response);
}
}
}
/* 만들어 놓은 LoginFilter 클래스가 언제 적용될지 설정 */
@Configuration // 서버가 켜질 때 해당 클래스 내 모든 메서드가 실행됨
public class FilterConfig {
@Bean // 반환된 객체를 Bean으로 등록 : LoginFilter로 타입을 제한함
public FilterRegistrationBean<LoginFilter> loginFilter() {
// FilterRegistrationBean : 필터를 Bean으로 등록하는 객체
FilterRegistrationBean<LoginFilter> filter = new FilterRegistrationBean<>();
// 사용할 필터 객체 추가
filter.setFilter(new LoginFilter());
// /myPage/* : myPage로 시작하는 모든 요청
String[] filteringURL = {"/myPage/*"};
// 필터가 동작할 URL 세팅
// Arrays.asList(filteringURL)
// -> filteringURL 배열을 List로 변환
filter.setUrlPatterns(Arrays.asList(filteringURL));
// 필터 이름 지정
filter.setName("loginFilter");
// 필터 순서 지정
filter.setOrder(1);
return filter; // 반환된 객체가 필터를 생성해서 Bean으로 등록
}
}
💡 /loginError 로
@Controller
public class MainController {
@RequestMapping("/") // "/" 요청 매핑(method 가리지 않음)
public String mainPage() {
// 접두사/접미사 제외
return "common/main";
}
// LoginFilter -> loginError 리다이렉트
// -> message 만들어서 메인 페이지로 리다이렉트
@GetMapping("loginError")
public String loginError(RedirectAttributes ra) {
ra.addFlashAttribute("message", "로그인 후 이용해 주세요~");
return "redirect:/";
}
}

