Tomcat의 버전이 올라가면서 보안상의 이유로 기본적으로는 서블릿을 실행하지 못하도록 설정이 되어있다.
하지만 서블릿을 실행못하면 웹 프로그램이라고 할 수 없지 않은가?
그래서 다음과 같이 설정해 주면 Tomcat에서 서블릿을 실행할 수 있다.
톰캣은 환경설정과 관련된 내용을 web.xml 파일에 담고 있다. 톰캣을 설치한 디렉터리의 conf 디렉터리에 있는 web.xml 파일을 수정함으로써 톰캣을 실행하는데 필요한 환경설정 정보를 변경할 수 있다.
□ 톰캣의 환경설정 파일
◇ %CATALINA_HOME%\conf\web.xml
web.xml 파일에서 서블릿을 실행할 수 있도록 서블릿의 접근 방법을 지정해 줌으로써 서블릿 서비스를 제공할 수 있다.
서블릿을 실행하기 위한 환경설정 파일을 수정해 보자. 다음의 위치에 설정되어 있는 주석을 해제하면 된다.
□ web.xml 파일의 변경
◇ 99번째 ~ 109번째 줄 주석 해제
<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>
◇ 348번째 ~ 351번째 줄 주석 해제
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
□ XML 문서의 주석문 기호
◇ 주석문의 시작 : <!--
◇ 주석문의 끝 : -->
위의 위치에 설정되어 있는 주석 기호를 삭제하면 서블릿을 실행할 수 있다.
그런데 Tomcat 6.0에서는 위와 같이 주석을 풀고 실행해도 Tomcat 시작시 다음과 같은 Exception이 발생한다.
java.lang.SecurityException: Servlet of class org.apache.catalina.servlets.InvokerServlet is privileged and cannot be loaded by this web application
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1134)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4045)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4351)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
정확한 이유는 모르겠지만, 톰캣 6.x 버전부터는 org.apache.catalina.servlets.InvokerServlet 클래스가 독점적 클래스로 바꿔어서 그렇단다.
그래서 다음과 같이 설정을 해 주어야 한다.
Tomcat 설치 디렉터리의 conf/context.xml 파일을 열고,
<Context> 태그를 다음과 같이 수정한다.
<Context reloadable="true" privileged="true">
그러면 Tomcat 시작 시 에러가 발생하지 않으며, 서블릿도 정상적으로 실행된다.
[원문 출처 : http://www.xmlstory.com/entry/tomcat60servlet ]