08_Spring_240418(목)_67일차(0) - ★BoardProject★ - 9. Filter

soowagger·2024년 4월 21일

8_Spring

목록 보기
21/38

8. Filter

8-1) LoginFilter 클래스 생성

/* 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);
		}
	}
}

8-2) FilterConfig - 설정용 클래스 생성

/* 만들어 놓은 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으로 등록
	}
}

8-3) 공통주소가 없는 메인 컨트롤러

💡 /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:/";
		
	}
}

✅ 마이페이지 경로 접근 시도 결과

profile

0개의 댓글