Servlet 접속 제한하기
다음은 서블릿필터에서 설정한 초기화 파라미터(서블릿 최대접속 갯수)를 읽어들여 최대 접속 이상 클라이언트 요청이 들어오면 브라우저에 적당한 메시지(“Too Busy”)를 보여주는 예제이다.
package ch15; 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.HttpServletResponse; public class ConLimitFilter implements Filter { int limit; int count; public void init(FilterConfig filterConfig) throws ServletException { String s = filterConfig.getInitParameter("limit"); if (s == null) throw new ServletException("Missing init parameter: " + limit); limit = Integer.parseInt(s); } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { if (count > limit) { HttpServletResponse httpRes = (HttpServletResponse) res; httpRes.sendError(httpRes.SC_SERVICE_UNAVAILABLE, "Too Busy."); } else { ++count; chain.doFilter(req, res); --count; } } public void destroy() { } }
위의 코드에서
++count;
chain.doFilter(req, res);
--count;
이 부분은 doFilter 기준으로 필터의 실행전과 실행후를 보여주는 과정을 볼수 있다. 필터가 여러개 있는 경우 다음 필터로 넘어가기 위해 필터 체인(FilterChain) 메소드를 사용한다.
다음 코드는 위의 필터를 테스트 하기위한 서블릿 코드이다.
이 서블릿 코드는 인위적으로 Delay 타임을 두어 여러번 호출되는 경우 위의 필터가 어떻게 반응하는지 보기위한 테스트 서블릿이다.
package ch15; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class WaitServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String waitStr = request.getParameter("time"); if (waitStr == null) throw new ServletException("Missing parameter: time"); int wait = Integer.parseInt(waitStr); try { Thread.sleep(wait * 1000); } catch (InterruptedException e) { throw new ServletException(e); } response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body><h1>WaitServlet Response</h1></body></html>"); } }
아래코드는 위의 필터와 서블릿을 web.xml에 등록한 코드이다.
web.xml
<filter> <filter-name>confilter1</filter-name> <filter-class>ch15.ConLimitFilter</filter-class> <init-param> <param-name>limit</param-name> <param-value>3</param-value> </init-param> </filter> <filter-mapping> <filter-name>confilter1</filter-name> <!-- <url-pattern>/*</url-pattern> --> <url-pattern>/wait</url-pattern> </filter-mapping>
<servlet> <servlet-name>waitservlet1</servlet-name> <servlet-class>ch15.WaitServlet</servlet-class> </servlet>
<servlet-mapping> <servlet-name>waitservlet1</servlet-name> <url-pattern>/wait</url-pattern> </servlet-mapping>
|
'Java > Java for the Web' 카테고리의 다른 글
GET과 POST 예제프로그램, (URL클래스를 이용한 웹컨텐츠 StreamData 읽기) (0) | 2013.11.15 |
---|---|
Filtering the Servlet Request & Response (0) | 2013.02.12 |
Cookie정보 보기 (0) | 2013.02.12 |
Session정보 보기 (0) | 2013.02.12 |
Hello Servlet (0) | 2013.02.12 |