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>

 

Posted by Steven J.S Min
,