SOCO
서블릿 필터 본문
지금까지 서블릿 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
interface에 javax.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);
}
}
'백 > Servlet,JSP(잠시 pause)' 카테고리의 다른 글
계산기 만들기 (0) | 2021.07.01 |
---|---|
클래스, 서블릿 클래스 (0) | 2021.07.01 |
post요청 : 한글 입력 문제 (0) | 2021.07.01 |
입력(요청)할 내용이 많은 경우 : post 요청 (0) | 2021.07.01 |
get요청(쿼리스트링, 사용자 입력을 통한 get요청) (0) | 2021.07.01 |