각 파일마다 한글 인코딩을 하기위해 request.setCharacterEncoding을 매번 작성한다면 몹시 번거로울 것입니다. 이때 사용하는 것이 Filter입니다.
클라이언트가 요청을 보내 서버가 작업하기전에 Filter에서 작업을 가로채 Filter 안에서 request.setCharacterEncoding 같은 작업을 미리 하면 다른 jsp 페이지에서는 Filter안의 작업을 신경쓸 필요가 없어집니다.
Filter 구조
package test.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* [ 요청을 가로채서 중간에 원하는 작업을 할수 있는 필터 만들기 ]
*
* 1. javax.servlet.Filter 인터페이스를 구현한다.
* 2. web.xml 을 만들고 거기에 필터를 정의하고 맵핑한다, 어노테이션도 가능
* 3. doFilter() 메소드 안에서 원하는 작업을 한다.
*/
public class EncodingFilter implements Filter {
//필터 객체가 제거될 때 실행되는 메소드
@Override
public void destroy() {
}
//필터 핵심 메소드, 클라이언트의 요청이 있을때마다 실행
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
}
//필터가 최초 사용될때 한번만 호출되는 메소드
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
Filter 클래스를 작성해봅시다.
Filter를 implements 시켜주고 메소드를 오버라이드 해줍니다.
- destroy() : 필터 객체가 제거될 때 실행되는 메소드
- doFilter() : 필터 핵심 메소드, 클라이언트의 요청이 있을때마다 실행
- init() : 필터가 최초 사용될때 한번만 호출되는 메소드
필터를 매핑하는 2가지 방법 ( web.xml, 어노테이션 )
1. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>Step05_Filter</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- EncodingFilter 정의하기 -->
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>test.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!-- EncodingFilter 맵핑하기(어떤 pattern의 요청이 왔을때 동작하기 할 것인지) -->
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2. 어노테이션
@WebFilter("/private/*")
클래스 위에 어노테이션을 넣습니다. /*은 모든 하위 경로를 뜻합니다.
인코딩 필터
package test.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* [ 요청을 가로채서 중간에 원하는 작업을 할수 있는 필터 만들기 ]
*
* 1. javax.servlet.Filter 인터페이스를 구현한다.
* 2. web.xml 을 만들고 거기에 필터를 정의하고 맵핑한다.
* 3. doFilter() 메소드 안에서 원하는 작업을 한다.
*/
public class EncodingFilter implements Filter {
//초기화 파라미터를 읽어와서 저장할 필드
private String encoding;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("EncodingFilter doFilter() 동작중... ");
//1. 만일 요청 인코딩이 설정되지 않았다면
if(request.getCharacterEncoding()==null) {
//인코딩 설정하기
request.setCharacterEncoding(encoding);
}
//2. 요청의 흐름 계속 이어가기
chain.doFilter(request, response);
}
//필터가 최초 사용될때 한번만 호출되는 메소드
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//encoding이라는 키값으로 저장된 utf-8 문자열 얻어오기
encoding=filterConfig.getInitParameter("encoding");
}
}
로그인 필터
package test.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//web.xml 필터 설정을 대신해서 어노테이션으로 동작하게 할 수 있다.
@WebFilter("/private/*")
public class LoginFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//1. 로그인된 클라이언트인지 확인( HttpSession이 필요 => HttpServletRequest가 필요)
HttpServletRequest req=(HttpServletRequest)request;
HttpSession session = req.getSession();
String id=(String)session.getAttribute("id");
//2. 만일 로그인된 상태라면 관여하지 않고 요청의 흐름을 이어가면되고
if(id!=null){
chain.doFilter(request, response);
}else {
//3. 로그인된 상태가 아니라면 로그인 폼으로 리다이렉트 이동시킨다. (HttpServletResponse 필요)
HttpServletResponse res=(HttpServletResponse)response;
String cPath=req.getContextPath();
res.sendRedirect(cPath+"/test/loginform.jsp");
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
'WEB' 카테고리의 다른 글
[JQuery] JQuery로 effect 넣기 - 숨기기/보이기/토글 효과 (0) | 2021.11.30 |
---|---|
[JQuery] JQuery를 사용해서 동적으로 요소 추가하기 (0) | 2021.11.30 |
[WEB] Forward & Redirect 개념과 차이점, 예제 (0) | 2021.11.29 |
[WEB] HTML, JSP에서 JQuery 사용법 / chainAction 속성 (0) | 2021.11.29 |
[Eclipse] 프로젝트 import 할 때 나타나는 버전 오류 해결법 (0) | 2021.11.29 |