filter에서 파라미터 받기
web.xml의 <web-app>안에 추가해야할 문장입니다.
<filter>
<filter-name>timer</filter-name>
<filter-class>com.filter.TimerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>timer</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
TimeFilter.java
package com.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.http.HttpServletRequest;
public class TimerFilter implements Filter {
private FilterConfig config;
@Override
public void destroy(){
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {
//req 필터
long begin= System.currentTimeMillis(); // 요청받았을 때의 시간 찍힘.
// 다음 필터 또는 필터의 마지막이면 jsp나 servlet 실행.
chain.doFilter(req, resp);
//resp 필터
long end=System.currentTimeMillis(); // 응답할 때의 시간 찍힘.
String uri;
if(req instanceof HttpServletRequest){
HttpServletRequest request=(HttpServletRequest)req; // ServletRequest에는 uri가 없으므로 다운캐스팅함.
uri=request.getRequestURI();
String msg=uri=uri+":"+(end-begin)+" ms";
config.getServletContext().log(msg); //getServletContext()의 log메소드를 이용한 콘솔창 출력.
//system.out.print 가 아닌 log를 이용하여 확인.
}
}
@Override
public void init(FilterConfig config)throws ServletException {
this.config = config;
}
}
// web.xml로 인하여 클라이언트의 모든 요청이 이곳의 TimerFilter클래스로 진입하여 doFilter()를 실행합니다.
// req 필터(요청된거 먼저) 이곳의 진입 시간을 찍고(long begin= System.currentTimeMillis();)
// chain.doFilter(req, resp); => 다음 필터실행, 실행할 필터가 없으면 jsp나 servlet실행하라는 명령입니다.
// resp 필터(응답 나중 )실행 long end=System.currentTimeMillis(); 실행합니다.
web.xml의 <web-app>안에 추가해야할 문장
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>com.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name> <!-- 해당경로에서만 사용할 수 있는 속성을 미리 정의함 (charset이라는 key로 utf-8이라는 값으로 정의함)
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
CharacterEncodingFilter.java
package com.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;
public class CharacterEncodingFilter implements Filter{
private String charset;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
// req 필터.
req.setCharacterEncoding(charset);
chain.doFilter(req, resp);
//resp 필터(없음).
}
@Override
public void init(FilterConfig config) throws ServletException {
charset=config.getInitParameter("charset"); //web.xml의 param을 통해 보낸 인자값을 getInitParameter을 통해서 받습니다.
if(charset == null || charset.lenght() == 0)
charset="utf-8";
}
}
// TimerFilter가 먼저 실행 : web.xml에서 먼저 작성되있기 때문입니다.
<filter>
<filter-name>login</filter-name>
<filter-class>com.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
LoginFilter.java
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {
if(req instanceof HttpServletRequest){
HttpServletRequest request = (HttpServletRequest)req;
HttpSession session=request.getSession();
String uri=request.getRequestURI();
boolean flag = false;
String[] u={
"/sbbs/created.kp","/sbbs/created_ok.kp" // 어떤 페이지를 로그인 해야만 접근할 수 있는지를 명시합니다.
};
for(String s:u){
if(uri.indexOf(s) != -1){
flag = true;
break;
}
}
if(session != null && flag){
// login에서 member라는 이름으로 로그인 정보를 저장한 경우입니다.
if(session.getAttribute("member") == null){
String p="/WEB-INF/views/member/login.jsp"; // 로그인 페이지의 경로를 적어줍니다.
RequestDispatcher rd = req.getRequestDispatcher(p);
rd.forward(req, resp);
return;
}
}
}
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
Filter의 실행 구조
implemente filter를 한 후에 destroy(), doFilter(ServletRequest req, ServletResponse resp,FilterChain chain), init(FilterConfig config) 3개의 메소드를 재정의해줍니다.
web.xml을 통하여 web.xml에 가장 먼저 작성된 순서로 명시된 Filter의 클래스로 돌아오게 되면 doFilter메소드를 실행합니다.
doFilter의 req명령을 실행하다가 중간에 chain.doFliter(req.resp); 만나게 되면 web.xml에 명시된 다음 Filter로 넘어갑니다. 만약 다음에 실행할 filter가 없으면 jsp나 servlet과 같은 클라이언트의 직접적인 요청을 처리하고 가장 나중에 실행된 filter부터 반대순으로 chain.doFilter(req,resp); 다음의 명령들을 실행하고 실행이 모두 끝나면 계속 반대순으로 처음에 시작했던 filter의 resp필터요청까지 끝냅니다.
'JAVA' 카테고리의 다른 글
[JAVA]getBean Test Main (0) | 2017.11.24 |
---|---|
[JAVA]ftp util (0) | 2017.11.24 |
[JAVA]Filter를 이용한 request 파라미터 변경 방법 (0) | 2017.11.23 |
[JAVA]Filter를 이용한 multipart/form-data 처리 및 파일 업로드 처리 (0) | 2017.11.23 |
[JAVA]filter 필터 (0) | 2017.11.23 |