[JSP/SERVLET] BHCPInitListener / Filter

Posted by 신희준 on September 26, 2017


2017 - 09 - 26 (화)

  • BHCPInitListener
  • Filter

  • 기본사항 정리


    1 . BHCPInitListener


    커넥션 풀
    데이터베이스와 연결된 커넥션을 미리 만들어 풀 속에 저장해 두고 있다가 필요할 때에 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환하는 기법.
    DBCP LIBRARY - 요즘은 많이 쓰기 때문에 APACHI 등등에서 제공을해줌


    BHCPInitListener 저장과정

    1.WEB.XML 에 아래 코드 저장


    <listener>
    		<listener-class>com.codechobo.DBCPInitListener</listener-class>
    	</listener>
    
    	<context-param>
    		<param-name>jdbcDriver</param-name>
    		<param-value>oracle.jdbc.driver.OracleDriver</param-value>
    	</context-param>
    

    listener를 추가하여 어플리케이션 실행시 com.codechobo.DBCPInitListener가 실행되도록 한다.

    jdcbcDriver 라는 이름의 파라미터에 oracle.jdbc.driver.OracleDriver 값 지정해준다.



    2.DHCPInitListener 클래스 정의

    public class DBCPInitListener implements ServletContextListener {
        public void contextInitialized(ServletContextEvent sce) {
            try {
                ServletContext context = sce.getServletContext();
                String drivers = context.getInitParameter("jdbcDriver");
                Class.forName(drivers);
                System.out.println("로딩완료");
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }
    	@Override
    	public void contextDestroyed(ServletContextEvent arg0) {
    		// TODO Auto-generated method stub		
    	}
    }
    

    어플리케이션이 실행되면 본 리스너가 실행된다. drivers 변수에 1번에서 받은 파라미터 값을 넣어준다. Class.forName으로 DB에 로딩을 시도한다. 이와 같이 DB로딩을 어플리케이션 실행시 해주면 종료시까지 DB로딩을 다시 해주지 않아도 된다. 기존에 UserDao 에 DB와 로딩하는 부분을 빼주자.


    2 . Filter



    필터는 말그대로 필터링한다고 생각하면 쉽다. 요청 (request), 응답 (response) 이 JSP또는 서블릿에 보내질 때 그 사이에 존재하여 적절히 여과시켜주는 것이다.

    예를 들면 비회원이 구매버튼을 클릭할 때, 비회원이 게시물보기 버튼을 눌렀을 때 상황을 생각해보면 간단하다. 이들은 분명히 요청한 페이지를 받아볼 수 없다.
     그 이유가 이 필터링이다. 필터에 의해 이 상황에서 응답받는 페이지는 로그인화면일 것이다.

    로그인체크 필터 적용 과정

    1 . web.xml에 filter태그와 filter-mapping 정의


    <filter>
      <filter-name>LoginCheck</filter-name>
      <filter-class>com.codechobo.LoginCheckFilter</filter-class>
    </filter>
    
    <filter-mapping>
      <filter-name>LoginCheck</filter-name>
      <url-pattern>/GetBoard</url-pattern>
    </filter-mapping>
    

    filter 이름인 LoginCheck / filter를 구현하는 클래스인 com.codechobo.LoginCheckFilter를 각각 저장한다.

    LoginCheck 필터를 /GetBoard 과 매핑 (누군가 게시물을 자세히 보고자할 떄 /GetBoard와 매핑되는 서블릿으로 이동한다.)

    1 . web.xml에 filter태그와 filter-mapping 정의

    public class LoginCheckFilter implements Filter {
    	@Override
    	public void destroy() {
    	}
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		// TODO Auto-generated method stub
    		HttpServletRequest httpRequest = (HttpServletRequest) request;
    		HttpSession session = httpRequest.getSession(false);
    		boolean login = false;
    		if(session!=null){
    			if(session.getAttribute("cid")!=null){
    				login=true;
    			}
    		}
    		if(login){
    			chain.doFilter(request, response);
    		}else{
    			RequestDispatcher dispacher = request.getRequestDispatcher("LoginForm.jsp");
    			dispacher.forward(request, response);
    		}
    	}
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {
    	}
    }
    

    destropy() 는 필터가 웹컨테이너에서 삭제될 때 불러진다.
    doFilter() 메소드는 실제 필터 역할을 하는 부분이다. session을 확인하여 로그인 상태를 확인하고 로그인값이 False이면 LoginForm 으로 forward한다.