Java 프레임워크 만들기 - JSP

자바 인코딩 필터 만들기 - Java Encoding Filter, 이클립스(Eclipse)

carrotweb 2021. 4. 8. 12:54
728x90
반응형

필터는 웹 브러우저의 요청과 Servlet/JSP/Resource 사이에서 "Request"와 "Response"에 대한 처리를 합니다.

WebBrowser -> Filter1 -> Servlet/JSP/Resource -> Filter1 -> WebBrowser

필터는 여러 개를 설정할 수 있고 설정 순서에 따라 처리 순서가 정해집니다. "FilterChain"이라 합니다.

WebBrowser -> Filter1 -> Filter2 -> Servlet/JSP/Resource -> Filter2 -> Filter1 -> WebBrowser

Filter Life Cycle(생명주기)는 간단하게 설명하면

init(최초 한번 실행) -> doFilter -> destory(WAS 종료 전 처리) 순으로 이루어 집니다.

1. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.home.project.test2"를 선택한 후 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Package]를 클릭하여 "Name"의 기존 패키지명에 ".filter"를 추가하고 "Finish"버튼을 클릭합니다. 추가된 "com.hom.project.test2.filter"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Filter]를 클릭합니다.

 

"Create Filter"창이 나타납니다.

패키지(com.hom.project.test2.filter)를 선택하고 컨텍스트 메뉴 [New > Filter]를 클릭하면 자동으로 "Java package"가 지정되어 나옵니다.

"Class name"에 "TestEncodingFilter"를 입력하고 "Next >"버튼을 클릭합니다.

"Initialization parameters"를 추가합니다.

"Description"은 필터의 설명으로 "Encoding Filter Test"을 입력합니다. 설명은 입력하지 않아도 됩니다.

"Initialization parameters"에서 "Add..."버튼을 클릭하여 파라메타 명은 "encoding", 파라메타 값은 "utf-8"을 입력하고 "OK"버튼을 클릭합니다. 파라메타 설명은 입력하지 않아도 됩니다.

"Initialization parameters"를 추가합니다.

"Initialization parameters"에서 "Add..."버튼을 클릭하여 파라메타 명은 "forceEncoding", 파라메타 값은 "true"을 입력하고 "OK"버튼을 클릭합니다. 파라메타 설명은 입력하지 않아도 됩니다.

"Filter mappings"를 추가합니다.

"Filter mappings"의 "/TestEncodingFilter"를 선택하고 "Edit..."버튼을 클릭한 후 "Pattern"를 "/*"로 입력합니다. 모든 웹 경로에 필터를 적용하기 위해서 입니다. "OK"버튼을 클릭합니다.

"Next >"버튼을 클릭합니다. 또는 "Finish"버튼을 클릭해서 완료할 수 있습니다.

 

"Interfaces"에 "javax.servlet.Filter"인터페이스를 받아 구현하는 것을 알 수 있습니다. "Finish"버튼을 클릭합니다.

"TestEncodingFilter.java"파일이 생성됩니다.

 

현재 "Dynamic Web Module 3.1"로 구성되어 있어 "TestEncodingFilter.java"에 "@WebFilter" 어노테이션을 사용하고 있습니다.

@WebFilter(
		description = "Encoding Filter Test", 
		urlPatterns = { "/*" }, 
		initParams = { 
				@WebInitParam(name = "encoding", value = "utf-8", description = "encoding"), 
				@WebInitParam(name = "forceEncoding", value = "true", description = "forceEncoding")
		})

"web.xml"에서 구성하고 싶다면 "TestEncodingFilter.java"에 "@WebFilter" 어노테이션을 삭제한 후 "web.xml"에 다음과 같이 추가하면 됩니다.

<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>com.home.project.test2.filter.TestEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

처리 방식은 동일합니다.

 

반응형

 

"TestEncodingFilter.java"에 "encoding", "forceEncoding" 문자열 지역 변수를 추가를 추가합니다.

private String encoding = "";
private String forceEncoding = "false";

"TestEncodingFilter.java"의 "init"에는 필터 정보로 부터 파라메타 값을 가져오는 "getInitParameter"를 이용하여 코딩합니다.

public void init(FilterConfig fConfig) throws ServletException {
	encoding = fConfig.getInitParameter("encoding") == null ? "" : fConfig.getInitParameter("encoding");
	forceEncoding = fConfig.getInitParameter("forceEncoding") == null ? "false" : fConfig.getInitParameter("forceEncoding");
}

"TestEncodingFilter.java"의 "doFilter"에 "request.setCharacterEncoding", "response.setCharacterEncoding"를 추가하고 저장합니다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	if (null != encoding && !"".equals(encoding)) {
		System.out.println("Apply Request Encoding");
		request.setCharacterEncoding(encoding);
	}

	// pass the request along the filter chain
	chain.doFilter(request, response);
	if (null != encoding && "true".equalsIgnoreCase(forceEncoding)) {
		System.out.println("Apply Response Encoding");
		response.setCharacterEncoding(encoding);
	}
}

"FilterChain"을 통해 다음 순서의 필터로 이동해 처리한 후 돌아옵니다. 그래서 "chain.doFilter(request, response);"를 기준으로 전처리와 후처리를 할 수 있습니다. 또한, 필터는 서블릿 보다 먼저 처리됨으로 "RequestDispatcher"를 이용하여 다른 서블릿이나 Jsp파일로 이동을 할 수 있습니다.

출력문을 추가한 것은 필터가 어느 순서에서 처리되는 지를 보기위해서 입니다.

 

 

2. "TestService3.java"파일에 "request.setCharacterEncoding("UTF-8");"를 삭제합니다.

public void process(HttpServletRequest request) throws UnsupportedEncodingException {
	String name = request.getParameter("name");
	System.out.println("name : " + name);
	request.setAttribute("name", name);
}

 

3. "Servers"탭에서 "Tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다. 웹 브라우저에서 "http://localhost:8080/test2/testform.do"를 입력한 후, 입력란에 "홍길동"을 입력하고 "전송"버튼을 클릭합니다.

전송된 한글이 정상적으로 나옵니다.

"Console"탭를 클릭해보면 필터가 제일 먼저 적용된 후 처리되는 것을 확인 할 수 있습니다.

 

"Spring"의 "CharacterEncodingFilter"와 동일한 수준으로 처리됩니다.

<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
728x90
반응형