ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서블릿필터 ServletFilter
    Servlet-JSP 2022. 1. 12. 23:53

    **유튜브 뉴렉쳐님의 강의를 들으면서 공부하고 정리한 내용입니다.

     

     

    우리는 WAS를 사용해서 웹 서버 개발을 하게 된다. 우리는 TOMCAT이라는 WAS를 사용해서 개발을 하게되는데, TOMCAT이 사용자로부터 요청이 들어오게 되면 적절한 소프트웨어를 사용해서 결과를 돌려주게 되어 있다.

    우리는 그것을 SERVLET이라고 부른다. 

     

    서블릿을 사용 할 떄 발생하는 메모리 공간을 서블릿 컨테이너라고 하며 WAS는 서블릿 컨테이너에 서블릿을 담아두고 요청이 들어 올 때마다 컨테이너에서 꺼내서 결과를 돌려주게 되며 더이상 사용하지 않는 서블릿을 경우 서블릿 컨테이너에서 삭제 하기도 한다.

     

    우리는 서블릿말고도 만들 수 있는 오브젝트가 있는데 그것을 서블릿필터라고 한다.

     

    Servlet Filter

    우리는 지난 시간에 

    웹페이지를 실행 할 때 한글이 깨지지 않게 설정을 바꿔주었었다. 앞으로 서블릿을 만들일이 많아질텐데 앞으로 만들어질 서블릿에서는 이 코드가 전부 필요하게 된다. 

    그럼 우리는 간단하게 서블릿이 가지고 있는 server.xml이라는 파일에 저 코드를 넣어줘서 모든 페이지에 적용이 될 수 있도록 간단하게 만들어 줄 수도 있다.

     

    하지만 이렇게 생각 해 보자. 우리집에는 지금 다섯식구가 살고 있다. 모두 자는 시간이 다르고 기상 시간도 다른데 한 사람의 기상/수면 시간에 맞춰서 모든 가족이 활동을 할 수는 없는 것이다. 각자 자기의 생활 패턴에 맞게 생황을 해야한다.

     

    그래서 우리가 생각 할 수 있는 것은 중간에 servlet filter라는 것을 넣어주는 것이다.

    이 servlet filter는 중간에 가로채기를 할 수 있다는 것이다.

    그래서 WAS가 SERVLET에 가는 동안에 servlet filter이 중간에 가로채서 servlet filter가 먼저 실행 된 후에 SERVLET이 실행 되게 할 수 있다.

    그리고 servlet filter가 실행 된 후 SERVLET이 실행 되고 말고의 실행 여부도 servlet filter가 결정 지어 줄 수 있다.

     

    servlet filter은 수문장이라고 생각하면 된다.

    접근권한이 있는지 없는지를 확인해서 SERVLET이 실행 되어야하는지 마는지도 책임지게 할 수 있고 모든 서블릿이 가지고 있어야 할 설정도 해줘서 거쳐가면서 실행 될 파일을 결정해주는 것이다.

     

    그리고 servlet filter에 설정한 소프트웨어가 SERVLET에 가기 전에 실행 되기도 하지만 SERVLET이 실행 된 후에 결과도 servlet filter에 넣어 줄 수 있다.

     

    그래서 사전과 사후에 필요한 소프트웨어가 있다면 이 servlet filter에 설정을 해 주면 된다.

     

    servlet filter를 만드는 방법 

    @WebServlet("/notice-reg")
    public class NoticeReg extends HttpServlet {
    	@Override
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws 
    	ServletException, IOException {
    		
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html; charset=utf-8");
    		request.setCharacterEncoding("UTF-8");
    		PrintWriter out = response.getWriter();
    		
    		String title = request.getParameter("title");
    		String content = request.getParameter("content");
    		
    		//DB를 연결 했다면 이 값을 DB에 저장 하거나 해야하는데 아직 DB 연결을 안했으니깐
    		//일단 그냥 반환만 해주자 
    		
    		//내용을 잘 받았다 이것이 맞니? 하고 돌려 주는 것.
    		out.println(title);
    		out.println(content);
    
    		}
    	}

    우리는 지난시간에 서블릿에 한글로 변환하는 코드를 설정 해 주었었다. 

    오늘은 이걸 서블릿 필터에 만들어주기로 한다. 우선 코드를 주석 처리 해 주고 

    기존 패키지에 만들지 말고 새로운 패키지를 만들어서 추가 해주도록 하자

     

    패키지명과 클래스이름을 설정 해주고 우측의 add 클릭 filter 검색->servletFilter 클릭

    ok 눌러서 add 한 다음 finish

    그럼 자동으로 implements 와 Override 된 것이 추가가 된다.

     

     

    이제 매개변수를 사용해서 filter를 구현 해 볼 것인데 필요없는 주석은 지워준다.

     

    이 filter를 설정하는데에는 두가지 방법이 있다.

     

    1. web.xml 파일을 이용하는 방법

    기존에 serlvet을 설정 해줬던 방법과 비슷하다.

    <filter></fllter>

    <filter-mapping></filter-mapping>을 작성 해 준 다음

    현재 내가 어떠한 클래스를 쓸 것인지(filter-class) 매핑 설정 될 때 사용 할 이름(filter-name)을 지정 해 준다.

    그리고 매핑에 와서 어떠한 필터에 대해서(filter-name) 어떤한 매핑을(url-pattern) 할 것인가를 지정 해 줘야 한다.

    만약 특정 url에 대해서 매핑을 하겠다 하면 url 주소를 지정 해 주면 되고 모든 url에 대해 지정 하고 싶다고 하면 /*로 지정 해 주면 된다. 우리는 우선 모든 url에 대해 매핑을 해 주는 것으로 해보자

    (패키지명,클래스명은 클릭 후 F2를 눌러주면 쉽게 할 수 있다.)

    	<filter>
    		<filter-name>characterEncodingFilter</filter-name> <!--사용 할 이름을 지정 해 준다 -->
    		<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class> 
    		<!-- 패키지명.클래스명까지 입력 해 준다. -->
    	</filter>
    	<filter-mapping>
    		<filter-name>characterEncodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>

    이렇게 해 주면 설정은 완료.

    이제부터 우리가 무언가를 요청하면 이 URL 요청에 의해 실행 되게 되는 것이다.

    실행을 해 보면 콘솔창에는 설정 해 둔 출력 메세지가 뜨지만 요청 페이지에는 아무 내용도 뜨지 않는다 

    그 이유는 출력 메세지가 실행이 되고 그 요청을 서블릿 쪽으로 보내는 것은 filter가 책임지기 때문이다.

    근데 그것은 filter chain이라는 것이 담당한다.

    그럼 chain.doFilter(request, response)를 중간에 작성 해 주면 chain을 전 후로 요청을 받았을 때 실행되는 코드와 결과를 반환 할 때 실행 되는 코드로 나뉘게 된다. 

    그래서 앞에는 before 뒤에는 after라고 생각하면 된다. 

    chain은 다음 실행을 관할하기 위한 녀석이고 여기서 조건 검색을 통해서 다음 실행을 어디로 가게 할 것인지 결정 할 수 있다.

     

    우리는 모든 작업이 실행 되기 전에 UTF-8을 실행 시켜야 하기 때문에 BEFORE 위치에 UTF-8코드를 작성 해 준다.

     

    1. @Annotation을 사용하는 방법

    1번에서 web.xml에서 설정한 filter 부분을 우선 주석 처리 한 다음 filter 클래스로 넘어와서 @WebFilter("")설정을 해 주면 된다.

     

    이렇게 @으로 지정 해 주면 xml 파일에 귀찮게 여러 코드를 치지 않아도 한번에 필터 설정이 가능 해 진다.

    우리는 앞으로 @으로 filter를 설정 해 주자.

Designed by Tistory.