티스토리 뷰
서블릿 필터 Servlet Filter 란?
그림을 보고 이해해보자!
WAS(우리가 사용하는 Tomcat)에서 Servlet(*. java)를 Request 할 때 Reponse 할 때 이 Filter를 통과해야 한다.
이 필터가 있음으로써 WAS에서 설정을 변경하지 않고도 모든 서블릿에 영향을 준다.
Servlet Filter는 값을 전달하는 역할도 하고, 접근권한, 인증까지도 설정할 수 있다.
이제 Servlet Filter를 설정하는 두 가지의 방법에 대해서 알아보자!
이번 예제는 Servlet Filter를 통해서 모든 Servlet의 URI인코딩 방식을 UTF-8로 변환하는 것이다.
1번째 방법.
직접 Web.xml코드를 수정해서 만드는 방법이다.
가장 먼저 Noticereg.java에서 인코딩했던 부분을 주석처리해준다. 그래야 여기서 필터 적용이 확인이 되겠지?
package com.newlecture.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@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);
}
}
먼저 새로운 class를 생성하고, 위의 사진처럼 interface도 추가해준다.
그리고 CharacterEncodingFilter.java 파일을 열고 코드를 수정해주자!
package com.newlecture.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Hello, Servlet Filter");
}
}
System.out.println("Hello, Servlet Filter"); 코드를 추가하고~
이번 방법에서는 web.xml파일에서도 서블릿 필터를 사용할 수 있도록 코드를 추가해주자.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="false">
<!-- 서블릿 필터 코드 -->
<filter>
<filter-name>CharEncodingFilter</filter-name>
<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
<filter>에서 필터의 정보를 입력하고, <filter-mapping>에서 필터의 매핑될 이름과 어떤 특정 URL 패턴에 대해서 이 필터를 적용할지 쓸 수 있다. 여기서는 /*를 사용해서 모든 URL에 사용하도록 했다.
이제 실행화면을 보자! reg.html 파일을 실행하면 된다.
화면에 아무것도 출력되지 않았다. 왜 일까????? 아까 이야기했듯이 이 필터에서 전달, 그리고 권한 부여, 인증 등을 할 수 있다고 했다. 하지만 클릭할 때마다 시스템창에 Hello, Servlet Filter가 출력됨을 보면 정상적으로 잘 작동하고 있다는 말씀! 그러면 이제 값을 전달할 수 있도록 다시 코드를 추가하자.
CharacterEncodingFilter.java
package com.newlecture.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Before, Servlet Filter");
chain.doFilter(request, response);
System.out.println("After, Servlet Filter");
}
}
Chian.doFilter(request, response); 라는 코드는 받은 값을 그대로 넘겨주는 역할을 한다.
전 후로 print문을 넣어서 잘 작동되는지를 확인하자.
이로써 Servlet Filter 1번 방법이었다.
2번째 방법 어노테이션 @Annotation을 이용한 방법이다.
먼저 1번에서 추가한 web.xml 파일에서 서블릿 필터 코드를 주석처리!
<?xml version="1.0" encoding="UTF-8"?>
<!-- 서블릿 필터 코드 -->
<!--
<filter>
<filter-name>CharEncodingFilter</filter-name>
<filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
주석처리 후에는 CharaterEncodingFilter.java 파일에 어노테이션을 추가해주자!
package com.newlecture.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.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);
}
}
Noticereg.java 서블릿에서 주석처리했던 request.setCharterEncoding("UTF-8"); 코드를
CharaterEncodingFilter.java에 추가해준다.
그리고 @WebFilter("/*) 어노테이션을 추가해서 /* 모든 URL에 필터를 적용시켜주자!
어노테이션을 이용하면 Web.xml의 코드들을 하나하나 수정하지 않고, 코드 두줄로 필터 추가가 가능해진다!
'Servlet JSP' 카테고리의 다른 글
여러 개의 Submit버튼 사용!(feat. 개발자도구를 통한 분석) (0) | 2021.04.23 |
---|---|
JSP 연습문제 더하기 웹 프로그램 (0) | 2021.04.23 |
전달 할 내용이 많을 경우에는 역시 POST(feat. 오류 및 문제해결) (0) | 2021.04.22 |
사용자 입력으로 Get요청 (0) | 2021.04.22 |
Get요청, 쿼리스트링 QueryString (0) | 2021.04.22 |