web.xml 를 알아보자.#

001 <?xml version="1.0" encoding="UTF-8"?>
002 
003 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
004 "http://java.sun.com/dtd/web-app_2_3.dtd">
005 
006 <web-app >
007    <display-name>appfuse</display-name>
008     <!-- You may experience issues in Mozilla < version 1.2 if you use  -->
009     <!-- ports other than 80 and 443, it seems to work fine with v1.2.  -->
010     <!-- For further information see the following article:             -->
011     <!-- http://www.javaworld.com/javaworld/jw-02-2002/jw-0215-ssl.html -->
012     <context-param>
013         <param-name>listenPort_http</param-name>
014         <param-value>8080</param-value>
015     </context-param>
016     <context-param>
017         <param-name>listenPort_https</param-name>
018         <param-value>8443</param-value>
019     </context-param>
020     <!-- Possible values: hibernate (might be more in the future-->
021     <context-param>
022         <param-name>daoType</param-name>
023         <param-value>hibernate</param-value>
024     </context-param>
025      <!-- Define the basename for a resource bundle for I18N -->
026     <context-param>
027         <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
028         <param-value>ApplicationResources</param-value>
029     </context-param>
030     <!-- Fallback locale if no bundles found for browser's preferred locale -->
031     <!-- Force a single locale using param-name 'javax.servlet.jsp.jstl.fmt.locale' -->
032     <context-param>
033         <param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
034         <param-value>en</param-value>
035     </context-param>
036     <!-- Context Configuration locations for Spring XML files -->
037     <context-param>
038         <param-name>contextConfigLocation</param-name>
039         <param-value>
040             classpath*:META-INF/applicationContext-*.xml
041             /WEB-INF/applicationContext-*.xml
042         </param-value>
043     </context-param>
044 
045       <filter>
046         <filter-name>securityFilter</filter-name>
047         <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
048         <init-param>
049             <param-name>targetClass</param-name>
050             <param-value>net.sf.acegisecurity.util.FilterChainProxy</param-value>
051         </init-param>
052     </filter>
053     <filter>
054         <filter-name>cacheFilter</filter-name>
055         <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
056     </filter>
057     <filter>
058         <filter-name>clickstreamFilter</filter-name>
059         <filter-class>com.opensymphony.clickstream.ClickstreamFilter</filter-class>
060     </filter>
061     <filter>
062         <filter-name>encodingFilter</filter-name>
063         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
064         <init-param>
065             <param-name>encoding</param-name>
066             <param-value>UTF-8</param-value>
067         </init-param>
068         <init-param>
069             <param-name>forceEncoding</param-name>
070             <param-value>true</param-value>
071         </init-param>
072     </filter>
073     <filter>
074         <filter-name>hibernateFilter</filter-name>
075         <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
076     </filter>
077     <filter>
078         <filter-name>rewriteFilter</filter-name>
079         <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
080     </filter>
081     <filter>
082         <filter-name>sitemesh</filter-name>
083         <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
084     </filter>
085     <filter>
086         <filter-name>exportFilter</filter-name>
087         <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
088     </filter>
089 
090    <filter>
091       <filter-name>loginFilter</filter-name>
092       <display-name>Login Filter</display-name>
093       <filter-class>org.appfuse.webapp.filter.LoginFilter</filter-class>
094       <init-param>
095          <param-name>enabled</param-name>
096          <param-value>true</param-value>
097       </init-param>
098    </filter>
099    <filter>
100       <filter-name>actionFilter</filter-name>
101       <display-name>Action Filter</display-name>
102       <filter-class>org.appfuse.webapp.filter.ActionFilter</filter-class>
103       <init-param>
104          <param-name>isSecure</param-name>
105          <param-value>false</param-value>
106       </init-param>
107    </filter>
108    <filter>
109       <filter-name>compressionFilter</filter-name>
110       <display-name>Compression Filter</display-name>
111       <filter-class>org.appfuse.webapp.filter.GZIPFilter</filter-class>
112    </filter>
113 
114       <filter-mapping>
115         <filter-name>securityFilter</filter-name>
116         <url-pattern>/j_security_check</url-pattern>
117     </filter-mapping>
118     <filter-mapping>
119         <filter-name>securityFilter</filter-name>
120         <url-pattern>*.html</url-pattern>
121     </filter-mapping>
122     <filter-mapping>
123         <filter-name>securityFilter</filter-name>
124         <url-pattern>*.jsp</url-pattern>
125     </filter-mapping>    
126     <filter-mapping>
127         <filter-name>loginFilter</filter-name>
128         <url-pattern>/login.jsp</url-pattern>
129         <!-- These are needed in case a request is forwarded to login.jsp -->
130         <dispatcher>REQUEST</dispatcher>
131         <dispatcher>FORWARD</dispatcher>
132     </filter-mapping>
133     <!-- Must be after securityFilter so request.getRemoteUser() works -->
134     <filter-mapping>
135         <filter-name>loginFilter</filter-name>
136         <url-pattern>/logout.jsp</url-pattern>
137     </filter-mapping>
138     <!-- Commented out for reasons: 1it's a pain when developing JSPs, and
139                                       2it causes the Signup webtest to fail -->
140     <!--filter-mapping>
141         <filter-name>cacheFilter</filter-name>
142         <url-pattern>*.jsp</url-pattern>
143     </filter-mapping-->
144     <!-- The 'hibernateFilter', a.k.a. Spring's OpenSessionInViewFilter
145          guarantees one session per request.  Performance seems to be the
146          same if it's enabled or disabled. -->
147     <filter-mapping>
148         <filter-name>hibernateFilter</filter-name>
149         <url-pattern>*.html</url-pattern>
150     </filter-mapping>
151     <filter-mapping>
152         <filter-name>actionFilter</filter-name>
153         <url-pattern>*.html</url-pattern>
154     </filter-mapping>
155     <filter-mapping>
156         <filter-name>clickstreamFilter</filter-name>
157         <url-pattern>*.html</url-pattern>
158     </filter-mapping>
159     <filter-mapping>
160         <filter-name>encodingFilter</filter-name>
161         <url-pattern>*.html</url-pattern>
162     </filter-mapping>
163     <filter-mapping>
164         <filter-name>encodingFilter</filter-name>
165         <url-pattern>*.jsp</url-pattern>
166     </filter-mapping>
167     <filter-mapping>
168         <filter-name>exportFilter</filter-name>
169         <url-pattern>*.html</url-pattern>
170     </filter-mapping>
171     <filter-mapping>
172         <filter-name>compressionFilter</filter-name>
173         <url-pattern>*.html</url-pattern>
174     </filter-mapping>
175     <!--filter-mapping>
176         <filter-name>rewriteFilter</filter-name>
177         <url-pattern>/*</url-pattern-->
178         <!-- These are needed by Tomcat 5 for forwards -->
179         <dispatcher>REQUEST</dispatcher>
180         <dispatcher>FORWARD</dispatcher>
181     <!--/filter-mapping-->
182     <filter-mapping>
183         <filter-name>sitemesh</filter-name>
184         <url-pattern>/*</url-pattern>
185         <!-- These are needed by Tomcat 5 for forwards -->
186         <dispatcher>REQUEST</dispatcher>
187         <dispatcher>FORWARD</dispatcher>
188     </filter-mapping>
189 
190       <listener>
191         <listener-class>com.opensymphony.clickstream.ClickstreamListener</listener-class>
192     </listener>
193     <listener>
194         <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class>
195     </listener>
196     <listener>
197         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
198     </listener>
199    <listener>
200       <listener-class>org.appfuse.webapp.listener.StartupListener</listener-class>
201    </listener>
202    <listener>
203       <listener-class>org.appfuse.webapp.listener.UserCounterListener</listener-class>
204    </listener>
205 
206    <servlet>
207       <servlet-name>login</servlet-name>
208       <display-name>Login Servlet</display-name>
209       <servlet-class>org.appfuse.webapp.action.LoginServlet</servlet-class>
210 
211       <init-param>
212          <param-name>authURL</param-name>
213          <param-value>j_security_check</param-value>
214       </init-param>
215       <init-param>
216          <param-name>isSecure</param-name>
217          <param-value>false</param-value>
218       </init-param>
219       <init-param>
220          <param-name>encrypt-password</param-name>
221          <param-value>true</param-value>
222       </init-param>
223       <init-param>
224          <param-name>algorithm</param-name>
225          <param-value>SHA</param-value>
226       </init-param>
227 
228       <load-on-startup>1</load-on-startup>
229 
230    </servlet>
231 
232      <!-- Standard Action Servlet Configuration -->
233     <servlet>
234         <servlet-name>action</servlet-name>
235         <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
236         <load-on-startup>2</load-on-startup>
237     </servlet>
238 
239       <!-- Front Controller Servlet Mapping -->
240     <servlet-mapping>
241         <servlet-name>action</servlet-name>
242         <url-pattern>*.html</url-pattern>
243     </servlet-mapping>
244 
245    <servlet-mapping>
246       <servlet-name>login</servlet-name>
247       <url-pattern>/authorize/*</url-pattern>
248    </servlet-mapping>
249 
250    <session-config>
251       <session-timeout>10</session-timeout>
252    </session-config>
253 
254    <!--
255    To specify mime mappings, create a file named mime-mappings.xml, put it in your project's mergedir.
256    Organize mime-mappings.xml following this DTD slice:
257 
258    <!ELEMENT mime-mapping (extension, mime-type)>
259    -->
260 
261        <welcome-file-list>
262         <welcome-file>index.jsp</welcome-file>
263     </welcome-file-list>
264 
265       <error-page>
266         <error-code>500</error-code>
267         <location>/error.jsp</location>
268     </error-page>
269     <error-page>
270         <error-code>400</error-code>
271         <location>/index.jsp</location>
272     </error-page>
273     <error-page>
274         <error-code>403</error-code>
275         <location>/403.jsp</location>
276     </error-page>
277     <error-page>
278         <error-code>404</error-code>
279         <location>/404.jsp</location>
280     </error-page>
281 
282       <taglib>
283         <taglib-uri>/WEB-INF/appfuse.tld</taglib-uri>
284         <taglib-location>/WEB-INF/appfuse.tld</taglib-location>
285     </taglib>
286 
287      <resource-ref>
288         <description>DB Connection</description>
289         <res-ref-name>jdbc/appfuse</res-ref-name>
290         <res-type>javax.sql.DataSource</res-type>
291         <res-auth>Container</res-auth>
292     </resource-ref>
293 
294    <!--
295    To set up security settings for your web app, 
296    create a file named web-security.xml, put it in your project's mergedir.
297    Organize web-security.xml following this DTD slice:
298 
299    <!ELEMENT security-constraint (display-name?, web-resource-collection+, auth-constraint?, user-data-constraint?)>
300    <!ELEMENT web-resource-collection (web-resource-name, description?, url-pattern*, http-method*)>
301    <!ELEMENT web-resource-name (#PCDATA)>
302    <!ELEMENT url-pattern (#PCDATA)>
303    <!ELEMENT http-method (#PCDATA)>
304    <!ELEMENT user-data-constraint (description?, transport-guarantee)>
305    <!ELEMENT transport-guarantee (#PCDATA)>
306 
307    <!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>
308    <!ELEMENT auth-method (#PCDATA)>
309    <!ELEMENT realm-name (#PCDATA)>
310    <!ELEMENT form-login-config (form-login-page, form-error-page)>
311    <!ELEMENT form-login-page (#PCDATA)>
312    <!ELEMENT form-error-page (#PCDATA)>
313    -->
314 
315 </web-app>

web.xml파일은 서블릿 컨테이너가 구동되면서 해당 애플리케이션을 처리하기 위한 설정파일이다. 구동되면서 메모리에 바로 올라가게 되는 클래스나 포트 및 filter, url-pattern등등 해당 웹 애플리케이션을 기본적인 특징을 파악하기에는 가장 기본적으로 체크해봐야 할 설정파일이라고 할수 있다.

web.xml파일의 내용은 위와 같다. 물론 extra디렉토리에서 다른 프레임워크를 사용하도록 설정을 했다면 일부 수정될수도 있다. 하지만 여기서는 기본적인 셋팅상황을 전제로 설명을 진행한다.

Context내에서 공유되는 값#

http또는 https를 위한 포트 설정(listenPort_http, listenPort_https)

설정의 11~18라인은 http요청및 https요청에 대한 처리를 담당하게 하게 되는 포트설정이다. 일반적으로 국내에서 이루어지는 웹애플리케이션에서는 이러한 설정을 하지 않느것으로 알고 있다. 이 설정은 일반 요청인 http요청과 보안(주민번호, 신용카드 번호 등의 개인의 신상정보등을 암호화하고 복호화하기 위한) https요청을 처리하는것을 분리하기 위해 셋팅하는 것이다. 보안이 요구되는 데이터의 경우 https(8443) 포트를 통해 서버와 클라이언트가 데이터를 주고 받고, 그 외의 일반 데이터인 경우 http(8080) 포트를 통해 데이터를 처리하여 데이터 종류에 따라 효율적인 데이터처리를 하고자 하는게 가장 큰 목적이라고 할수 있다. 이에 관련해서는 http://www.javaworld.com/javaworld/jw-02-2002/jw-0215-ssl.html에서 자세히 볼수 있다.

데이터베이스 처리(daoType)

데이터베이스 정보를 처리하기 위한 부분을 hibernate가 담당하도록 하겠다는 값이다.

다국어 지원(javax.servlet.jsp.jstl.fmt.localizationContext, javax.servlet.jsp.jstl.fmt.fallbackLocale)

다국어 관련 값들을 저장하는 properties파일명을 지정하는 부분이다. 여기서 어느 인코딩을 사용하는지에 대한 참조는 request객체의 getCharacterEncoding()메소드를 사용하여 반환되는 값을 기반하여, javax.servlet.jsp.jstl.fmt.localizationContext의 값인 ApplicationResources_인코딩값.properties 로 지정이 된다. 한국어로 된 properties파일은 현재 없으므로, javax.servlet.jsp.jstl.fmt.fallbackLocale의 값인 en에 기초하여 ApplicationResources_en.properties를 참조하게 된다.

Spring설정파일 위치 지정(contextConfigLocation)

이 부분은 Spring설정파일을 지정하는 부분으로 설정파일이 여러개일 경우 META-INF/applicationContext-*.xml, /WEB-INF/applicationContext-*.xml 처럼 *를 사용하여 파일형태를 지정할수 있다. 기본으로 생성되는 설정파일은 applicationContext-resources.xml, applicationContext-security.xml파일 두개이다.

필터#

인증 관련 작업(securityFilter)

현재의 웹 애플리케이션의 인증작업은 필수라고 할수 있다. Spring이 사용하는 기본 인증 시스템은 Spring의 하위 프로젝트인 Acegi Security이다. 114~125라인의 설정처럼 /j_security_check, *.html, *.jsp에 대한 호출은 Acegi Security에 의해 인증값이 체크된다. Acegi Security는 WEB-INF/applicationContext-security.xml파일이 설정을 사용한다.

<div class="note"> 버전에 관련한 사항

여기서 사용되는 버전은 0.8.3이고 현재 Acegi는 1.0RC1까지 릴리즈되어있다. 여기서 주의할점은 0.8.3에서는 패키지가 net.sf.acegisecurity 로 시작하는 구조이지만, 현재는 org.acegisecurity 로 시작하는 구조이다. </div> securityFilter값인 net.sf.acegisecurity.util.FilterToBeanProxy는 Spring관리 빈에 해당 필터요청을 위임한다. 여기서 targetClass값은 필수로 정의가 되어야 하는데, targetClass값으로 명시된 net.sf.acegisecurity.util.FilterChainProxy대신에 net.sf.acegisecurity.util.FilterToBeanProxy가 프록시처럼 작동하게 된다.

캐싱 사용(cacheFilter)

웹 성능을 향상시키기 위해 캐시를 사용하는 설정이다. 여기서 사용한 캐싱용 프레임워크는 OpenSymphony의 OSCache이다. OSCache는 WEB-INF/classes/oscache.properties파일의 설정을 사용한다. 140~143라인에서 *.jsp파일에 대해서는 캐싱을 하도록 되어 있으나 주석처리 되어 있다.

사용자 행위 추적(clickstreamFilter)

사용자가 어떤 행위를 하는지에 대한 추적을 담당하는 필터 설정이다. 여기서 사용한 프레임워크는 ClickStream이다. 155~158라인에서 보듯이 *.html에 대한 요청을 추적한다.

인코딩 설정(encodingFilter)

요청인코딩에 대한 설정이다. 여기선 UTF-8을 사용하였다. forceEncoding값을 true로 설정하여, 브라우저에서 임의로 다른 인코딩을 설정하더라도 UTF-8로 오버라이드한다. 159~166라인에서 보듯이 *.html파일과 *.jsp파일에 인코딩 설정을 적용한다.

Hibernate Session와 View(hibernateFilter)

서블릿 2.3은 Hibernate Session을 요청의 전체 처리를 위한 쓰레드에 바인드한다. 원래의 트랜잭션이 이미 완료가 되었음에도 불구하고 웹 view에서 lazy로딩을 허용하는 "Open Session in View" 패턴을 사용하고자 하는데 목적이 있다. 여기서 사용되는 OpenSessionInViewFilter는 요청별로 하나의 Hibernate Session을 보장한다. 이로 인해 view가 Hibernate Session에 접근해야 할 경우, Session이 소멸된 상태가 아닌체로 접근가능하게 된다. 관련된 "Open Session in View" 패턴에 대해서는 http://www.hibernate.org/43.htmlhttp://openframework.or.kr/JSPWiki/Wiki.jsp?page=OpenSessionInView 를 참조하길 바란다. 147~150라인에서 보듯이 *.html파일에만 적용되도록 설정되어 있다.

rewriteFilter

RewriterFilter에 대한 설정이다. 이 rewriteFilter는 정규표현식에 대응되는 URL을 다시 쓰고 포워딩한다. 이것은 사이트를 다시 디자인하는동안 URL을 변경하거나 JSP구조를 숨기길 원할때 유용하다. 여기서 사용된 필터에 대한 자세한 정보는 http://tuckey.org/urlrewrite/에서 찾을수 있다.

사이트 구조화(sitemesh)

tiles에 대체되고 있는 sitemesh에 대한 설정이다. sitemesh에 대한 자세한 정보는 http://www.opensymphony.com/sitemesh/에서 찾을수 있다.

사이트 내용 뿌리기(exportFilter)

사용자가 보는 화면 컨텐츠를 보여주기 위한 설정이다. 여기서 사용된 필터는 displayFilter이고 자세한 정보는 http://displaytag.sourceforge.net/에서 찾을수 있다.

로그인 관리(loginFilter)

사용자 로그인을 처리하는 필터 설정이다. org.appfuse.webapp.filter.LoginFilter 클래스가 담당하고 있다. 해당 클래스처럼 Filter인터페이스를 implement하여 다른 방식으로 구현가능하다.

Action 관리(actionFilter)

Action을 처리하는 필터 설정이다. org.appfuse.webapp.filter.ActionFilter 클래스가 담당하고 있다. 해당 클래스처럼 Filter인터페이스를 implement하여 다른 방식으로 구현가능하다.

압축 관련(compressionFilter)

컨텐츠 압축에 관련한 필터 설정이다. 서블릿 필터를 사용하여 컨텐츠를 압축하는 내용에 대해서 좀더 상세하고 알고 싶을때는 다음을 참고한다. 번역문은 http://blog.empas.com/tmheo74/read.html?a=1360599, 이 번역문의 원문은 http://www.onjava.com/lpt/a/4361

리스너(Listener)#

여기서 사용된 리스너는 총 5가지이다.

  • com.opensymphony.clickstream.ClickstreamListener
  • net.sf.navigator.menu.MenuContextListener
  • org.springframework.web.util.IntrospectorCleanupListener
  • org.appfuse.webapp.listener.StartupListener
  • org.appfuse.webapp.listener.UserCounterListener

서블릿과 서블릿 맵핑#

  • login : org.appfuse.webapp.action.LoginServlet
  • action : org.apache.struts.action.ActionServlet

세션설정#

세션종료를 위한 timeout값이 10분으로 되어있다.

Context디폴트 파일및 Error페이지#

태그 라이브러리를 위한 TLD파일#

DB 연결에 관련한 설정#

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-10) was last changed on 06-Apr-2006 09:45 by 이동국