SOCO

서블릿 필터 본문

백/Servlet,JSP(잠시 pause)

서블릿 필터

ssooda 2021. 7. 1. 12:35

지금까지 서블릿 object를 만들었는데

이외에도 필터 object를 만들 수 있음

-------

클라이언트 <-------> 웹서버 WAS 서블릿 컨테이너
서블릿

라이언트 < = > 웹 서버 & WAS & 서버 어플리케이션(서블릿) ->서블릿이 존재하는 공간은 서블릿 컨테이너

 

요청이 들어오면 WAS는 서블릿을 실행시켜서 서블릿 컨테이너에 담아놓고 결과를 돌려줌

--------

 

한글을 입력받는 서블릿에서는 1or2를 해야함

1. request.setCharacterEncoding("UTF-8")

2. 톰캣 설정 자체를 UTF-8로 바꾸기 (server.xml 파일에서)

 

BUT, 1,2이외에도 필터라는 것을 사용할 수도 있음

필터는 요청과 응답을 하려면 반드시 거쳐가게 됨

(WAS -> 필터 -> 서블릿)

(WAS <- 필터 <- 서블릿)

따라서, 1)인코딩 방식 설정, 2)접근권한 검사 등을 할 수 있음

 

1. 필터를 만드는 방법

1) 클래스 생성

new class 

패키지 안에 클래스 만들 예정 : com.newlecture.web.filter

interfacejavax.servlet.Filter추가


public class CharacterEncodingFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, 
			ServletResponse response, FilterChain chain)
			throws IOException, ServletException 
	{	
    	//1. 요청(request)이 왔을 때 
    	System.out.println("before filter"); //2.콘솔창에 출력됨
    	chain.doFilter(request,response); 
        //3.흐름을 넘겨서 다음 필터, 서블릿이 실행되도록
        //4.그 결과(response)가 여기로 돌아오면 
        System.out.println("after filter"); //5.콘솔창에 출력됨
	}

}

필터는 톰캣이 실행되는 순간, 요청이 있는 순간에 실행됨

따라서 처음 요청하는 경우 톰캣 실행 + 요청 이므로 2번 실행되고

이후 부터는 요청이 있는 순간에 실행됨

 

2) chain.doFilter(request,response)

=> 다음 실행을 관할하기 위함 

-> 조건 검사를 통해서 다음 실행을 어디로 가게 할 것인지 결정 지을 수 있음

 

3) 종합

public class CharacterEncodingFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, 
			ServletResponse response, FilterChain chain)
			throws IOException, ServletException 
	{
		request.setCharacterEncoding("UTF-8"); //입력시 인코딩 방식 지정
		
		chain.doFilter(request, response); //다음 서블릿으로 넘겨줌
	}

}

 

기존의 NoticeReg서블릿에서는 인코딩 방식 주석처리(비교위해)

@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");
		
		out.println(title);
		out.println(content);
	}

}

 

2. 필터 설정

방식1. web.xml에서 변경

//web.xml에서 변경	
    <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>

*현재 파일 위치 알고 싶으면 F2

 

방식2. 필터 파일에서 annotation : @WebFilter("")

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, 
			ServletResponse response, FilterChain chain)
			throws IOException, ServletException 
	{
		request.setCharacterEncoding("UTF-8"); //입력시 인코딩 방식 지정
		
		chain.doFilter(request, response);
	}

}