본문 바로가기

JSP(Java Server Page)

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.length()==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.doFilter(req,resp); 만나게 되면 web.xml에 명시된 다음 Filter로 넘어간다. 만약 다음에 실행할 filter가 없으면 jsp나 servlet과 같은 클라이언트의 직접적인 요청을 처리하고 가장나중에 실행된 filter부터 반대순으로 chain.doFilter(req,resp); 다음의 명령들을 실행하고 실행이 모두 끝나면 계속 반대순으로 처음에 시작했던 filter의 resp필터요청까지 끝낸다.