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에서 먼저 작성되있기 때문입니다.




web.xml의 <web-app>안에 추가해야할 문장

<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필터요청까지 끝냅니다.

블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,