'톰캣'에 해당되는 글 1건

  1. 2009.02.13 J2SE 기반의 서블릿 개발 환경설정 - web.xml

1. 톰캣(Tomcat)의 버전별 개발 환경
For the impatient, current Apache Tomcat production quality releases vs. Servlet/JSP specifications.

자카르타 프로젝트 사이트 : http://jakarta.apache.org/

 Servlet/JSP Spec   Apache Tomcat version 
 2.5/2.1  6.0.18
 2.4/2.0  5.5.27
 2.3/1.2  4.1.39
 2.2/1.1  3.3.2 (archived)

각종 교재를 통한 JSP를 시작할 때에는 교재에서 사용하는 버전을 확인한 뒤 반드시 해당하는 버전을 설치하도록 한다. 특히 JSP 1.2에서 JSP 2.0으로의 변화는 매우 크므로 주의할 필요가 있다.

여기서 다루는 서블릿 개발 환경설정은 servlet-api.jar 파일을 이용한 API연결을 통하여 개발 환경을 설정하는 방법을 기재하도록 하겠다. 만약 EJB(Enterprise JavaBean)를 개발한다면 J2EE을 설치하는 것을 권장한다. 여기서는 J2SE를 설치했다는 가정하에 설명하도록 하겠다.

아래의 서블릿 개발 환경설정을 간추려 보면 이와 같은 순서를 거치게 된다.

- web.xml 수정 : 서블릿 개발을 위한 주석 제거
- API 연결 : servlet-api.jar 파일 복사
- 환경변수 설정 : classpath 설정


2. 서블릿 개발을 위한 web.xml 파일 설정 - web.xml

web.xml 파일에는 서블릿 개발환경을 위한 부분이 주석 처리 되어 있다. 이 주석을 해제하여 서블릿 개발환경을 만들 수 있다. 서블릿을 사용하지 않을 생각이면 굳이 web.xml 파일을 수정하지 않아도 된다. web.xml 파일내의 주석을 지우는 이유는 서블릿 작성하여 개발하기 위함이다.



  <!-- The "invoker" servlet, which executes anonymous servlet classes      -->
  <!-- that have not been defined in a web.xml file.  Traditionally, this   -->
  <!-- servlet is mapped to the URL pattern "/servlet/*", but you can map   -->
  <!-- it to other patterns as well.  The extra path info portion of such a -->
  <!-- request must be the fully qualified class name of a Java class that  -->
  <!-- implements Servlet (or extends HttpServlet), or the servlet name     -->
  <!-- of an existing servlet definition.     This servlet supports the     -->
  <!-- following initialization parameters (default values are in square    -->
  <!-- brackets):                                                           -->
  <!--                                                                      -->
  <!--   debug               Debugging detail level for messages logged     -->
  <!--                       by this servlet.  [0]                          -->

  <!--
    <servlet>

        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
  -->

  <!-- The JSP page compiler and execution servlet, which is the mechanism  -->

  <!-- used by Tomcat to support JSP pages.  Traditionally, this servlet    -->


찾기(Ctrl + F)를 이용하여 web.xml 파일 내용중의 첫번째 'invoker'를 검색한 뒤 <servlet></servlet> 태그의 위·아래 주석을 제거한다.



    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- The mapping for the
invoker servlet -->

    <!--
    <servlet-mapping>

        <servlet-name>invoker</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    -->

    <!-- The mapping for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>


찾기(Ctrl + F)를 이용하여 web.xml 파일 내용중의 다음 'invoker'를 검색한 뒤 <servlet-mapping></servlet-mapping> 태그의 위·아래 주석을 제거한다. 


참고사항 : <url-patten>/servlet/*</url-patten> 에서 servlet 을 삭제하면 어떠한 결과가 생기는 지 한번 확인해보록 한다. 웹 브라우저의 주소창에서 /servlet/ 경로를 굳이 치지 않아도 되는 멋진 결과를 경험 할 수 있을 것이다.



3. API 연결

서블릿을 작성하기 위해서는 API를 연결해야 한다. 서블릿/JSP은 J2EE의 영역이지만 J2SE에서도 라이브러리 파일을 복사하고 환경변수에 연결하면 된다. 복사하려는 servlet-api.jar에는 서블릿 관련 된 부분이 있으며, 자바와 관련된 개발의 기반은 JDK 클래스를 참조하도록 되어 있으므로 서블릿을 개발하기 위해서는 기본적으로 JDK 클래스가 있어야 한다.

아래의 버전에 맞는 라이브러리 폴더에서 servlet-api.jar 파일을 복사한 뒤 기존에 설치되어 있는 JDK의 라이브러리(lib) 폴더에 붙여넣어 준다.


Tomcat 5.5.x 대 버젼 예시 : c:\program files\apache-tomcat-5.5.15\common\lib
Tomcat 6.0.x 대 버젼 예시 : c:\program files\apache-tomcat-6.0.18\lib


4. 환경변수 설정

환경변수는 이전의 DOS환경에서의 PATH와 같은 것으로 윈도우즈 환경 변수의 전반적인 설정이 포함되어 있으니 이와 관련된 사항을 잘 알지 못한다면 함부로 바꾸는 것을 권하지 않는다.

Windows Vista 환경
제어판 -> 시스템 및 유지 관리 -> 시스템 -> 고급 시스템 설정 -> 환경 변수 -> 시스템 변수
참조 : 클래식 보기라면 XP와 동일하다

Windows XP 환경
제어판 -> 시스템 -> 고급 -> 환경변수 -> 시스템 변수

시스템의 변수에 CLASSPATH가 존재하고 있다면 편집을 눌러 변수값 제일 끝부분에다가 아래와 같은 예시와 같은 방법으로 기재하여 준다. 없다면 추가 해서 아래 예시와 같은 방법으로 기재하여 생성한다.

예) c:\Program files\Java\jdk1.5.0_06\lib\servlet-api.jar;


5. Tomcat 버전이 6.0.x 라면? - context.xml


java.lang.reflect.InvocationTargetException
.
.
.
Caused by: java.lang.SecurityException: Servlet of class org.apache.catalina.servlets.InvokerServlet is privileged and cannot be loaded by this web application


설치된 Tomcat의 버전이 6.0.x버전이라면 한가지 작업을 더 해줘야 한다. 이 작업을 하지 않는다면 Apache Tomcat Properties을 이용해서 서버를 구동 시키는 분들은 위의 메세지를 볼수 없겠지만 tomcat6.exe 로 실행 시킨다면 위의 메시지를 접할 수 있게 될 것이다.

Why is the invoker evil?

This is opinions of the writer (YMMV) Quickie about the invoker: The invoker is a dynamic servlet which allows run-time loading of other servlets based on class name. This servlet is the one that allows  http://localhost/servlet/com.foo.MyClass?more=cowbell, where com.foo.MyClass is some class which can be loaded as a servlet but was never explicitly declared in a config file.

Evil because:
Security risk ... see links above

Configuration hiding - There is NO way to determine which servlets are used vs which are not used. In web.xml, every servlet is declared and mapped. In that one file you instantly have a road map to how the webapp works.

Back doors. Servlets which are mapped can be alternately called via the invoker by class name. Since the URL is different, all security constraints might be ignored since the URL pattern is VERY different.

Back doors. Bad programmers make it easier to do bad things.

Back doors. It may be common to use common 3rd party jars in a shared area. If that shared jar has servlets in them and that servlet has a hole in it, bad things happen.

Configuration hiding - it's important enough to say twice. Explicit declaration while a PITA, will be more helpful in the maintenance scheme of your webapp.

For another explanation of the invoker servlet, why it's evil, and what to do about it,
see JavaRanch FAQ.


출처 :
http://tomcat.apache.org/


버전이 증가함에 따라 InvokerServlet의 보안에 대한 취약점을 발견한 거 같다. 6.0.x에서는

context.xml 파일을 열어서 <context> 태그에 attribute값으로 아래의 내용을 추가한다.


 <Context reloadable="true" privileged="true">



6. 마지막 작업

서버 재시작해주는 센스를 발휘한다. 항상 conf 폴더내의 파일들을 수정했을 때에는 서버 구동을 중단한 상태에서 하거나 구동중이었다면 재부팅 해주도록 한다.

Posted by 리트모스
: