The Debugging Chronicles : "코드의 미학"

[servlet] 필터 Filter 본문

서버프로그래밍 JSP

[servlet] 필터 Filter

sweetseonah1004 2024. 9. 5. 09:41

모든 자바 클래스는 POJO인데

대표적인 not POJO 가 서블릿이다.

그중 특수한 형태의 서블릿이 있는데 

서블릿을 상속받은 1) 리스너와 2) 필터이다. 

 

리스너는 모니터링, 감지를 (어떤 순간에 동작된다) 

필더는 모든 특정 요청에 대해 항상 수행되는 서블릿이다.

 

필터에는 3가지 종류가 있다

보안 / 인가,허가,인증,권한확인 / 인코딩

 

보안은 우리가 건들릴 수 없다.

인코딩은 자동으로 수행된다

실습은 인가, 허가, 인증, 권한확인으로 한다.


 

그럼 필터를 만들어보자

valid 가 아니라 vaildFilter

 

기본 생성자

destory 

항상 수행되는 dofilter

chain.dofilter는 다음 필터를 호출하는 역할

아니면 원래하던 메서드를 마저 수행한다.

 

필터 동작 원리는

v ->   logout.do-----> main.do ---->v

나 로그 아웃 할래 그럼 다시 메인으로 가 라면


만약 필터가 끼게 되면

v -> |필터  logout.do-----> |필터 main.do ---->v

 

 

 

web.xm에 자동 등록되는 데 지우고 webFilter를 등록한다.

 

 

필터가 먼저 수행됨

 

.do 할 때 마다 필터가 여러번 호출 된다.

 

로그인을 하지 않았는데도 메인으로 뚤린다.

이런 페이지 이동을 막아야한다.

 

권한확인 로직을 작성해보자

 

 

로그인을 하는 건 당연하니까  로그인 안했니로 구현한다.

 

 

로그인 안했은면 에러 페이지로 보낸다

요청추출을 한다

 

세션을 꺼내보자

에러로 가려면 예외를 발생시키면 된다.

HTTPservlet request가 아니라 ServletRequset라서 타입을 낮춰주기위해 형변환(타입 캐스팅)을 해준다

 

 

체크 예외로 nullpointerExceptiond을 넣어준다.

 

 

각종 권한 체크를 필터로 해보면 된다.

 


 

 

ValidFilter.java

package controller.common;

import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;

@WebFilter("*.do")
public class ValidFilter extends HttpFilter implements Filter {
       
    public ValidFilter() {
        super();
    }
    
    public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("로그 : 필터가 호출됨");
		
		// 권한확인 로직
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		String uri=httpRequest.getRequestURI();
		String cp=httpRequest.getContextPath();
		String command=uri.substring(cp.length());
		if(command.equals("/mypagePage.do")) {
			if(httpRequest.getSession().getAttribute("loginInfo") == null) {
				throw new NullPointerException(); // uncheck 예외
			}
		}
		
		chain.doFilter(request, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}

}