7.28 filter
dispatcher servlet이 getParameter하기 전에 filter로 인코딩 변경(servlet 요청 전처리, 응답 후처리)
Filter는 tomcat was에 의해서 관리(Spring bean 사용 불가) (javax.servlet.Filter)
web.xml에 mapping 등록된 순서대로 filter 호출
ex. 권한없는 사용자 막기, 한글처리하기
원리
package com.bitc.filter.filters;
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;
public class EncodingFilter implements Filter{
@Override //초기값전달(web.xml)에 정의되어있는거
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init EncodingFilter Start");
System.out.println("init EncodingFilter End");
}
@Override //필수
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 전처리
System.out.println("doFilter EncodingFilter Start");
chain.doFilter(request, response); // FilterChain에 등록되어있는 모든 filter의 메소드 호출.끝나면 서블릿에 request 전달.
// 후처리
System.out.println("doFilter EncodingFilter End");
}
@Override //서버에서 삭제될때 마지막에 호출
public void destroy() {
System.out.println("EncodingFilter Destroy");
}
}
인코딩 필터(CharacterEncoding) Spring 에서 실사용 하는법(클래스 정의 필요 x)
<!-- spring encoding filter -->
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
로그파일 생성하는 필터 만들어보기
<!-- web application Server에 Filter 등록 -->
<filter>
<filter-name>printLogFilter</filter-name>
<filter-class>com.bitc.filter.filters.PrintFilter</filter-class>
<init-param>
<param-name>printDir</param-name>
<param-value>/log</param-value>
</init-param>
<init-param>
<param-name>printFile</param-name>
<param-value>filterLog.log</param-value>
</init-param>
</filter>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.bitc.filter.filters.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- mapping 등록된 순서대로 filter 호출 -->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>printLogFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class PrintFilter implements Filter{
private String printDir;
private String printFile;
private PrintWriter pw;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init PrintFilter START ------------------------");
printDir = filterConfig.getInitParameter("printDir");
printFile = filterConfig.getInitParameter("printFile");
ServletContext application = filterConfig.getServletContext();
// application server project를 기준으로
// 지정한 경로의 절대경로를 반환(배포된 운영체제에 맞게끔 경로 반환)
String path = application.getRealPath(printDir);
System.out.println("path :"+ path);
File file = new File(path);
if(!file.exists()) {
System.out.println("폴더 생성");
file.mkdirs();
}
if(pw == null) {
try {
file = new File(path, printFile);
pw = new PrintWriter(new FileWriter(file,true),true);// printWriter2번째 매개변수-autoflush, fileWriter는 append
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("init PrintFilter END ------------------------");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("doFilter PrintFilter START ------------------------");
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
pw.println("======================================================");
pw.printf("로그 시간 : %s %n",sdf.format(new Date()));
pw.printf("요청 IP : %s %n",req.getRemoteAddr());
pw.printf("요청 경로 : %s %n",req.getRequestURI());
pw.printf("전송 방식 : %s %n",req.getMethod());
chain.doFilter(request, response);
pw.printf("응답 코드 : %d %n",res.getStatus());
pw.println("======================================================");
System.out.println("doFilter PrintFilter END ------------------------");
}
@Override
public void destroy() {
System.out.println("PrintFilter destroy ------------------------");
}
}
파일입출력시 실제 프로젝트경로에서 파일 생성하도록 서버 설정 변경(Serve modules without publishing 체크)
->안정적으로 생성된 파일 관리 가능
이렇게 설정 시 jsp페이지에 있는 jstl은 WEB-INF/lib/ 경로 내에 라이브러리jar 파일 존재해야 실행 가능.(귀찮으면 서버에 넣기)