LoginProcessServlet 에서 세션에 ID를 저장하도록 할 것이므로 필터 처리에 예외가 되도록 한다. LoginProcessServlet 를 거치지 않고서는 ID가 세션에 없으므로 무조건 로그인 화면으로 가버리게 되기 때문이다.
package com.study;
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;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter {
public void init(FilterConfig _fc) throws ServletException {
}
public void doFilter(ServletRequest _request, ServletResponse _response,
FilterChain _chain) throws IOException, ServletException {
System.out.println("LoginFilter....");
_request.setCharacterEncoding("EUC-KR");
HttpServletRequest hs_request = (HttpServletRequest)_request;
HttpSession hs_session = hs_request.getSession();
String uri = hs_request.getRequestURI();
System.out.println(" => Request URI: " + uri);
if (uri.indexOf("LoginProcess.do") < 0) { // LoginProcess 서블릿은 필터링 예외로 둔다.
String id = (String)hs_session.getAttribute("id");
System.out.println(" => ID: " + id);
if (id == null || id.trim().length() == 0) { // ID가 세션에 없다면
HttpServletResponse hs_response = (HttpServletResponse)_response;
hs_response.sendRedirect("/Round_18/login.htm");
return;
}
}
_chain.doFilter(_request, _response); // '가던 길로 가세요~' 라는 의미 :)
}
public void destroy() {
}
}
LoginProcessServlet.java
로그인 처리 서블릿에서는 세션에 ID를 저장하고 Main.do를 호출한다.
package com.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginProcessServlet extends HttpServlet {
public void doPost(HttpServletRequest _request, HttpServletResponse _response)
throws IOException, ServletException {
System.out.println("LoginProcessServlet....");
// 계정 검증 처리 작업
// ....
// 검증 작업 후 ID를 세션에 저장 후 페이지 이동
HttpSession session = _request.getSession();
session.setAttribute("id", _request.getParameter("id"));
_response.sendRedirect("Main.do"); // SendRedirect() : GET 요청 발생
}
}
웹 프로그램에서는 데이터베이스의 환경 설정과 연결 관리등을 XML 파일이나 속성 파일을 사용하여 관리하고 특정 이름을 사용하여 이 정보를 얻어온다.
웹에서 불특정 다수의 사용자가 DB연결을 요청한다고 무작정 허용한다면 DBMS는 부하를 감당할 수 없을 것이다.
따라서 연결 개수를 설정하여 현재 연결된 사용자가 더 이상 Connection 객체를 사용하지 않을 경우 해당 Connection 객체를 반환받아서 다른 사용자에게 할당해야 한다. 이런 작업을 Connection Pooling이라 하고 DBCP(Database Connection Pooling)이라 부른다.
여기서는 톰캣의 DBCP(Database Connection Pool)를 사용하여 DBMS Connection 객체를 생성, 사용하는 방법에 대해 알아본다.